多线程应用实例_第1页
多线程应用实例_第2页
多线程应用实例_第3页
多线程应用实例_第4页
多线程应用实例_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

五、程序源码利用Windows95 环境下的多线程编程技术实现的基于TCP/IP的可视电话的部分源码 基于TCP/IP可视电话主窗口的窗口过程 主叫方TCP/IP接收线程 被叫方TCP/IP接收线程 语音编、解码线程/基于TCP/IP可视电话主窗口的窗口过程LONG APIENTRY MainWndProc(HWND hWnd,UINT message,UINT wParam, LONG lParam)static HANDLE hThreadG7231,hThreadTCPListen,hThreadTCPRev;DWORDThreadIDG7231,ThreadIDTCPListen,ThreadIDTCPRev;static THREADPACK tp;static THREADPACK tp1;unsigned char Buf80;CAPSTATUS capStatus;switch (message)case WM_CREATE:Init_Wsock(hWnd); /初始化一些数据结构Init_BS(2,&bs);vd_tx_pdu.V_S = 0;vd_tx_pdu.N_S = 0;vd_rx_pdu.V_R = 0;vd_tx_sdu.bytes = 0;if( dnldProg ( hWnd, h324g723.exe) )/装入语音编解码的DSP核心MessageBox(hWnd,Load G.723.1 Kernel Error,Error,MB_OK);PostQuitMessage(0); elseMessageBox(hWnd,Load G.723.1 Kernel OK!,Indication,MB_OK);/创建语音编解码的线程parag7231.hWnd = hWnd;hThreadG7231=CreateThread (NULL, 0,(LPTHREAD_START_ROUTINE)G723Proc, (G7231DATA *)?g7231, CREATE_SUSPENDED,(LPDWORD)&ThreadIDG7231);if (!hThreadG7231)wsprintf(Buf, Error in creating G7231 thread: %d,GetLastError();MessageBox (hWnd, Buf, WM_CREATE, MB_OK);/创建TCP/IP接收线程tp1.hWnd = hWnd;hThreadTCPRev = CreateThread (NULL, 0,(LPTHREAD_START_ROUTINE)AcceptThreadProcRev,(G7231DATA *)&tp1,CREATE_SUSPENDED,(LPDWORD)&ThreadIDTCPRev);if (!hThreadTCPRev)wsprintf(Buf, Error in creating TCP Receive thread: %d,GetLastError();MessageBox (hWnd, Buf, WM_CREATE, MB_OK);/开始侦听网络SendMessage(hWnd,WM_COMMAND,IDM_LISTEN,NULL);break;case WM_VIDEO_ENCODE: /图象编码if(needencode)EncodeFunction(hWnd);needencode = SendVideoToBuff(&vd_tx_sdu, buff);frameMode=TRUE;capPreview(capWnd,FALSE);capOverlay(capWnd,FALSE);capGrabFrameNoStop(capWnd);break;case WM_VIDEO_DECODE: /图象解码Video_Decod_begin = 1;play_movie();Video_Decod_begin = 0;break;case WM_COMMAND:switch(LOWORD(wParam)case IDM_CONNECT: /响应对方的呼叫,接通可视电话WskConnect( hWnd );ResumeThread(hThreadTCPRev); /运行TCP/IP接收线程ResumeThread(hThreadG7231); /运行语音编解码线程BeginG7231Codec(); /初始化图象采集卡,并开始采集图象frameMode = FALSE;capWnd = capCreateCaptureWindow(LPSTR)Capture Window, WS_CHILD | WS_VISIBLE, 100, 100, 176,144 , (HWND) hWnd, (int) 0);capSetCallbackOnError(capWnd, (FARPROC)ErrorCallbackProc) ;capSetCallbackOnStatus(capWnd, (FARPROC)StatusCallbackProc) ;capSetCallbackOnFrame(capWnd, (FARPROC)FrameCallbackProc) ;capDriverConnect(capWnd, 0);CenterCaptureWindow(hWnd, capWnd);capDlgVideoSource(capWnd);capDlgVideoFormat(capWnd);capDlgVideoCompression(capWnd);capGetStatus(capWnd,&capStatus,sizeof(CAPSTATUS);StartNewVideoChannel(hWnd, capWnd) ;image = image_one;frameMode = TRUE;capPreview(capWnd,FALSE);capOverlay(capWnd,FALSE);capGrabFrameNoStop(capWnd);break;case IDM_LISTEN: /拨对方号码,呼叫对方sock = socket( AF_INET, SOCK_STREAM, 0);if (sock = INVALID_SOCKET) MessageBox(hWnd, socket() failed, Error, MB_OK);closesocket(sock);break;if (!FillAddr(hWnd, &local_sin, FALSE ) /获取TCP/IP地址和端口号break;EnableMenuItem(GetMenu( hWnd ), IDM_LISTEN, MF_GRAYED);SetWindowText( hWnd, Waiting for connection.);bind ( sock , (struct sockaddr FAR *)&local_sin,sizeof(local_sin);if (listen( sock, MAX_PENDING_CONNECTS ) 0)sprintf(szBuff, %d is the error, WSAGetLastError(); MessageBox(hWnd, szBuff, listen(sock) failed,MB_OK);break;tp.hWnd=hWnd; /开始本地的TCP/IP接收线程_beginthread(AcceptThreadProc,0,&tp);ResumeThread(hThreadG7231); / 开始本地语音编解码的线程break;case IDM_DISCONNECT: /挂断可视电话CloseG7231Codec();SuspendThread(hThreadG7231);SuspendThread(hThreadTCPRev);WSACleanup();Init_Video_Decod_Again();capSetCallbackOnError(capWnd, NULL);capSetCallbackOnStatus(capWnd, NULL);InvalidateRect(hWnd,NULL,1); capSetCallbackOnFrame(capWnd, NULL);capSetCallbackOnVideoStream(capWnd, NULL);capDriverDisconnect(capWnd);Init_Wsock(hWnd);MessageBox(hWnd, Now closing the Video telephone,MB_OK);SetDisConnectMenus(hWnd);SendMessage(hWnd, WM_COMMAND,IDM_LISTEN,NULL);break;case IDM_EXIT:CloseG7231Codec();SendMessage(hWnd, WM_CLOSE, 0, 0l);break; default:return (DefWindowProc(hWnd, message, wParam, lParam);break;case WM_CLOSE:if (IDOK !=MessageBox( hWnd, OK to close window?, gszAppName,MB_ICONQUESTION | MB_OKCANCEL )break ;case WM_DESTROY:WSACleanup();CloseG7231Codec();TerminateThread(hThreadG7231,0);TerminateThread(hThreadTCPRev,0);capSetCallbackOnError(capWnd, NULL);capSetCallbackOnStatus(capWnd, NULL);capSetCallbackOnFrame(capWnd, NULL);capSetCallbackOnVideoStream(capWnd, NULL);capDriverDisconnect(capWnd);FreeAll();PostQuitMessage(0);break;default: /* Passes it on if unproccessed*/return (DefWindowProc(hWnd, message, wParam, lParam);return (0);/主叫方TCP/IP接收线程DWORD WINAPI AcceptThreadProc( PTHREADPACK ptp )SOCKADDR_IN acc_sin; /* Accept socket address internet style */int acc_sin_len; /* Accept socket address length */int status;acc_sin_len=sizeof(acc_sin);/调用阻塞函数accept,一直到远端响应为止sock=accept( sock,(struct sockaddr FAR *) &acc_sin,(int FAR *) &acc_sin_len );if (sock hWnd, szBuff, accept(sock) failed, MB_OK);return (1);SetConnectMenus( ptp-hWnd ); /远端提机,可视电话接通BeginG7231Codec();while (1)beg1: status = recv(SOCKET)sock, r_mux_buf,MY_MSG_LENGTH, NO_FLAGS_SET );if (status = SOCKET_ERROR) status = WSAGetLastError();if( status = 10054 )MessageBox(ptp-hWnd,对方挂断电话,Indication, MB_OK);SendMessage( ptp-hWnd, WM_COMMAND,IDM_DISCONNECT,NULL);_endthread();return (1); goto beg1; if (status) r_mux_buf status = 0; if ( r_mux_buf_filled = 1 ) r_mux_buf_overwrite = 1; elser_mux_buf_filled = 1; r_mux_buf_length = status; else MessageBox( hWnd, Connection broken, Error, MB_OK); SendMessage( ptp-hWnd, WM_COMMAND,IDM_DISCONNECT,NULL); _endthread(); return (2); demux(); /线路码流H.223解码 return (0);/被叫方TCP/IP接收线程 DWORD WINAPI AcceptThreadProcRev( PTHREADPACK ptp )int status;while (1) beg2:status = recv(SOCKET)sock, r_mux_buf,MY_MSG_LENGTH, NO_FLAGS_SET );if (status = SOCKET_ERROR)status =WSAGetLastError();if( status = 10054 )MessageBox(ptp-hWnd,对方挂断电话,Indication, MB_OK);SendMessage( ptp-hWnd, WM_COMMAND,IDM_DISCONNECT,NULL);return (1);goto beg2; if (status)r_mux_buf status = 0;if( r_mux_buf_filled = 1 )r_mux_buf_overwrite = 1;elser_mux_buf_filled = 1;r_mux_buf_length = status;elseMessageBox( hWnd, Connection broken, Error, MB_OK);SendMessage( ptp-hWnd, WM_COMMAND,IDM_DISCONNECT,NULL);return (2);demux();/* while (forever) */return (0);/语音编、解码线程DWORD WINAPI G723Proc(G7231DATA *data)int i,len;Audio_tx_pduad_tx_pdu;unsigned char m

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论