2024年10月VC++ 多线程?VC多线程

 更新时间:2024-10-12

  ⑴VC++多线程?VC多线程

  ⑵你要考虑到你开辟线程以后,如果线程还没执行到flag=false,那么此时flag还是true,但是主线程已经if(flag==true)了,你就死了。你创建线程用的_beginthreadex函数是吧?(如果是_beginthread,请换成_beginthreadex,这个函数有返回值,可以强制转为HANDLE类型:HANDLEhThread=(HANDLE)_beginthreadex(...);然后这个hThread是可以等待的:WaitForSingleObject(hThread,INFINITE);线程结束之前,这个WaitForSingleObject函数不会返回。等待完毕之后关闭HANDLE释放资源:CloseHandle(hThread);连起来就是:for(....){HANDLEhThread=(HANDLE)_beginthreadex(开辟线程;WaitForSingleObject(hThread,INFINITE);CloseHandle(hThread);}线程函数里{线程函数内容;return}

  ⑶//开始按钮代码改为下面这样voidCMultiThreadDlg::OnStart(){UpdateData(TRUE);hThread=CreateThread(NULL,,(LPTHREAD_START_ROUTINE)ThreadFunc,(VOID*)this,,&ThreadID);}//线程代码作如下修改UINTWINAPIThreadFunc(LPVOIDpParam){CMultiThreadDlg*dlg=(CMultiThreadDlg*)pParam;intinteger=dlg-》m_nCount;dlg-》GetDlgItem(IDC_START)-》EnableWindow(FALSE);//线程代码dlg-》GetDlgItem(IDC_START)-》EnableWindow(TRUE);}

  ⑷vc如何多线程处理CSocket数据

  ⑸因为CSocket类要用到窗口的消息机制才能进行收发,所以用线程可以这样用的,你可以参考用如下的方法:CMySocket*pSocket;...ThreadFunc(){pSocket=newCSocket;pSocekt-》Create();pSocket-》Connect(...);while(...){MSGmsg;Sleep();if(::PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE)){::TranslateMessage(&msg);::DispatchMessage(&msg);}。。。//线程的其他代码);}希望以上的代码对你有用

  ⑹C++多线程和VC++多线程一样么

  ⑺是一样的!VC是一个环境他有自己的MFC库,但MFC库就是用C++实现的……之所以这么问估计是你还不太熟悉VC如果一定要有区别的话:那么单独的C++去实现多线程,那么就只能使用系统的API。而vc环境下则不一定,可以使用MFC的相关函数来实现,同样也可以使用系统API

  ⑻VC++最简单的多线程

  ⑼#include《windows.h》#include《iostream》usingnamespacestd;DWORDWINAPIMyThread(PVOIDpvParam){for(inta=;a《;a++){cout《《“Thread“《《endl;Sleep();}return;}DWORDWINAPIMyThread(PVOIDpvParam){for(intb=;b《;b++){cout《《“Thread“《《endl;Sleep();}return;}DWORDWINAPIMyThread(PVOIDpvParam){for(intc=;c《;c++){cout《《“Thread“《《endl;Sleep();}return;}intmain(){HANDLEhThread=CreateThread(NULL,,MyThread,NULL,,NULL);HANDLEhThread=CreateThread(NULL,,MyThread,NULL,,NULL);HANDLEhThread=CreateThread(NULL,,MyThread,NULL,,NULL);Sleep();cout《《“Main“《《endl;CloseHandle(hThread);CloseHandle(hThread);CloseHandle(hThread);return;}首先创建一个线程实用APICreateThread,还有就是一个线程函数的原型.HANDLECreateThread(LPSECURITY_ATTRIBUTESlpsa,DWORDcbStack,LPTHREAD_START_ROUTINElpStartAddr,LPVOIDlpvThreadParam,DWORDfdwCreate,LPDWORDlpIDThread);DWORDWINAPIThreadProc([in]LPVOIDlpParameter);还有就是Sleep这个函数是放弃自己运行的时间片....

  ⑽VC如何实现多线程文件传输

  ⑾发送端,将文件分成N份(如,FILE(-a字节,FILE(a-b字节,FILE(b-c字节,FILE(c-d字节,FILE(d-文件长度。发送可以使用M个线程(如,THREAD负责发送FILE,依次类推,发送的每个数据包包括如下内容:文件内容的长度,文件内容,文件内容起始点相对于整个文件的位置,文件内容相对于整个文件的位置。例如:文件A的总长度为字节,则可以先发送一个数据包给接收端,让其准备接收,接着发送(长度,....(内容的二进制流),(起始,(结束。接收端根据接收的包写文件即可。看一下吧

  ⑿vc多线程参数传递问题

  ⒀可以这样做:为线程参数定义一个结构体structthreadParam{HANDLE*self;HANDLE*other;//还可以定义一些其他你认为需要的参数};//假设有个线程A、BHANDLE*HA=newHANDLE;HANDLE*HB=newHANDLE;threadParam*pA=newthreadParam;PA-》self=HA;PA-》other=HB;*HA=createthread(NULL,funcA,PA,....);将PA做为参数传递给线程A。这样就可以在线程函数里通过指针使用a,b的线程句柄了。同样创建b线程的时候这样做一遍就ok。不知道这样说明白否?

  ⒁CRT原先是指Microsoft开发的CRuntimeLibrary,用于操作系统的开发及运行。后来在此基础上开发了C++RuntimeLibrary,所以现在CRT是指Microsoft开发的C/C++RuntimeLibrary。在VC的CRT/SRC目录下,可以看到CRT的源码,不仅有C的,也有C++的。CRT原先的目的就是支持操作系统的运行。因为Windows操作系统除汇编部分外,都是用C/C++编写的,所以内核及许多关键服务都在CRT上运行(它们都采用dll技术动态链接。此外,用VC编写的C/C++程序也用到它们(可以动态链接,也可以静态链接,前者运行时需要系统中已安装CRT的dll,后者不需要。可以说,CRT就是Microsoft编写Windows时使用的低层类库。然后,它又被当作C++标准库的一个实现包含在了VC系列中;我们在VC中使用的C++标准库,其实就是CRT的一个真子集(少了C++标准所不包含的代码,特别是大量的低层C代码至于CRT与WINDOWSAPI的关系,与许多人理解的相反,WINDOWSAPI作为Windows的一部份,是在CRT的基础上开发的。你可以将Windows(及其API看作一个项目,而这个项目使用的语言是汇编/C/C++,使用的类库就是CRT。所以,离开CRT,WindowsAPI也无法使用的。参考:还是CreateThread的问题好像比较复杂,一两句话说不清楚,你可以看看这篇文章:

  ⒂在VC中,多线程如何调用类得成员函数

  ⒃函数内部调用:HANDLEhThread=CreateThread(NULL,,FunProc,(LPVOID)this,,NULL);HANDLEhThread=CreateThread(NULL,,(LPTHREAD_START_ROUTINE)thread,&m_prog,,NULL);CloseHandle(hThread);CloseHandle(hThread);Sleep();}DWORDWINAPIListenThreadFunc(LPVOIDlpParameter){CTestDlg*pDlg=(CTestDlg*)lpParameter;//把传过来的参数再强制转换回CTestDlg*类型pDlg-》GetDlgItem(IDC_EDIT)-》SetWindowText(“abc“);//就可以了}thread(CProgressCtrl*pro)//更新进度条{inti=;for(;i《;){pro-》SetPos(i);Sleep();i=i+;if(i》)i=;else;if(stopmark==){pro-》SetPos();break;}}return;}DWORDWINAPIFunProc(LPVOIDlpParameter)//调用程序{OTSDlg*pDlg=(OTSDlg*)lpParameter;//把传过来的参数再强制转换回CTestDlg*类型pDlg-》Modeprocess();//就可以了return;}控制多线程,开启、暂停、继续、终止(实例我们这些文盲以前一听到多线程这么几个字,以为非常的高级,难搞!!昨天翻阅了一下MSDN,发现,其实也没那么难,关键在于全面的理解,也许是用多了API了,慢慢的会看懂了一些!!!我总结了几个易于理解的出来,一起共享!我们先不讲如何使用线程过程中的参数;先来个简单的;下篇文章我们在讲如何使用线程过程的参数来实现交互!AfxBeginThread创建线程函数原型:CWinThread*AfxBeginThread(AFX_THREADPROCpfnThreadProc,LPVOIDpParam,intnPriority=THREAD_PRIORITY_NORMAL,UINTnStackSize=,DWORDdwCreateFlags=,LPSECURITY_ATTRIBUTESlpSecurityAttrs=NULL);该函数用于创建线程;返回值类型为:CWinThread*,一个指向新线程的线程对象参数:pfnThreadProc线程的入口函数,声明一定要如下:UINTMyThreadFunction(LPVOIDpParam);pParam:传递入线程的参数,注意它的类型为:LPVOID,所以我们可以传递一个结构体入线程.nPriority:线程的优先级,一般设置为.让它和主线程具有共同的优先级.nStackSize:指定新创建的线程的栈的大小.如果为,新创建的线程具有和主线程一样的大小的栈dwCreateFlags:指定创建线程以后,线程有怎么样的标志.可以指定两个值:CREATE_SUSPENDED:线程创建以后,会处于挂起状态,直到调用:ResumeThread:创建线程后就开始运行.lpSecurityAttrs:指向一个SECURITY_ATTRIBUTES的结构体,用它来标志新创建线程的安全性.如果为NULL,那么新创建的线程就具有和主线程一样的安全性.如果要在线程内结束线程,可以在线程内调用AfxEndThread.结束线程的两种方式当你在后台用线程来打印一些图形时.有时在打印一部分后,你希望可以停下来,那么此如何让线程停止呢.下面会详细的向你解释要结束线程的两种方式:这是最简单的方式,也就是让线程函数执行完成,此时线程正常结束.它会返回一个值,一般是成功结束,当然你可以定义自己的认为合适的值来代表线程成功执行.在线程内调用AfxEndThread将会直接结束线程,此时线程的一切资源都会被回收.:如果你想让别一个线程B来结束线程A,那么,你就需要在这两个线程中传递信息.不管是工作者线程还是界面线程,如果你想在线程结束后得到它的确结果,那么你可以调用:::GetExitCodeThread函数------------------------------------------------------------------------------------------------------------------------SuspendThread挂起(暂停线程函数原型:DWORDSuspendThread(HANDLEhThread//指定线程的句柄);这个函数的返回值:DWORD类型,如果这个函数成功,返回值是线程的前停止计数,否则,它(表示)-。-------------------------------------------------------------------------------------------------------------------------------ResumeThread继续执行线程函数原型:DWORDResumeThread(HANDLEhThread//指定线程的句柄);这个函数的返回值:DWORD类型,如果这个函数成功,返回值是线程的前停止计数,否则,它(表示)-。----------------------------------------------------------------------------------------------------------------------------------WaitForSingleObject终止线程DWORDWaitForSingleObject(HANDLEhHandle,DWORDdwMilliseconds);参数hHandle是一个事件的句柄dwMilliseconds在指定暂停区间,在毫秒。这个函数将返回如果区间流逝,即使该对象的状态是nonsignaled。如果dwMilliseconds是零,功能测试对象的状态和回报。如果dwMilliseconds是INFINITE的,这个函数的暂停区间从不流逝。

  ⒄多线程程序在VC.如何配置

您可能感兴趣的文章:

相关文章