您当前的位置:首页 > 美文摘抄 > 内容

VC++ 多线程?VC多线程

本文目录

  • VC++ 多线程
  • VC多线程
  • vc 如何多线程处理CSocket数据
  • C++多线程和VC++多线程一样么
  • VC++ 最简单的多线程
  • VC如何实现多线程文件传输
  • vc多线程参数传递问题
  • 关于VC++多线程
  • 在VC中,多线程如何调用类得成员函数
  • 多线程程序在VC6.0如何配置

VC++ 多线程

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

VC多线程

//开始按钮代码改为下面这样void CMultiThread2Dlg::OnStart(){ UpdateData(TRUE); hThread=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadFunc, (VOID*)this, 0, &ThreadID);} //线程代码作如下修改UINT WINAPI ThreadFunc(LPVOID pParam){ CMultiThread2Dlg *dlg = (CMultiThread2Dlg *)pParam; int integer = 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(5);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》using namespace std;DWORD WINAPI MyThread1(PVOID pvParam){ for(int a=0;a《10;a++) { cout《《“Thread1“《《endl; Sleep(10000); } return 0;}DWORD WINAPI MyThread2(PVOID pvParam){ for(int b=0;b《3;b++) { cout《《“Thread2“《《endl; Sleep(2000); } return 0;}DWORD WINAPI MyThread3(PVOID pvParam){ for(int c=0;c《7;c++) { cout《《“Thread3“《《endl; Sleep(7000); } return 0;}int main(){ HANDLE hThread1 = CreateThread(NULL, 0, MyThread1, NULL, 0, NULL); HANDLE hThread2 = CreateThread(NULL, 0, MyThread2, NULL, 0, NULL); HANDLE hThread3 = CreateThread(NULL, 0, MyThread3, NULL, 0, NULL); Sleep(5000); cout《《“Main“《《endl; CloseHandle(hThread1); CloseHandle(hThread2); CloseHandle(hThread3); return 0;}首先创建一个线程实用API CreateThread , 还有就是一个线程函数的原型.HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpsa, DWORD cbStack, LPTHREAD_START_ROUTINE lpStartAddr, LPVOID lpvThreadParam, DWORD fdwCreate, LPDWORD lpIDThread); DWORD WINAPI ThreadProc( [in] LPVOID lpParameter);还有就是Sleep这个函数是放弃自己运行的时间片....

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

发送端,将文件分成N份(如5),FILE1(0-a字节),FILE2(a-b字节),FILE3(b-c字节),FILE4(c-d字节),FILE5(d-文件长度)。 发送可以使用M个线程(如5),THREAD1负责发送FILE1,依次类推,发送的每个数据包包括如下内容:文件内容的长度,文件内容,文件内容起始点相对于整个文件的位置,文件内容相对于整个文件的位置。例如:文件A的总长度为100000字节,则可以先发送一个数据包给接收端,让其准备接收,接着发送 4000(长度),....(内容的二进制流),0(起始),4000(结束)。 接收端根据接收的包写文件即可。 http://www.vckbase.com/document/viewdoc/?id=448 看一下吧

vc多线程参数传递问题

可以这样做:为线程参数定义一个结构体structthreadParam{HANDLE*self;HANDLE*other;//还可以定义一些其他你认为需要的参数};//假设有2个线程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。不知道这样说明白否?

关于VC++多线程

CRT原先是指Microsoft开发的C Runtime Library,用于操作系统的开发及运行。后来在此基础上开发了C++ Runtime Library,所以现在CRT是指Microsoft开发的C/C++ Runtime Library。在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与WINDOWS API的关系,与许多人理解的相反,WINDOWS API作为Windows的一部份,是在CRT的基础上开发的。你可以将Windows(及其API)看作一个项目,而这个项目使用的语言是汇编/C/C ++,使用的类库就是CRT。所以,离开CRT,Windows API也无法使用的。参考:http://hi.baidu.com/glorysnow/blog/item/b38daf8bbafb877d9e2fb4d8.html_beginthread还是CreateThread的问题好像比较复杂,一两句话说不清楚,你可以看看这篇文章:http://hi.baidu.com/hbrr224/blog/item/be2ed4074064a8cd7b8947c7.html

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

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

多线程程序在VC6.0如何配置

  • 调用线程时,向LPARAM参数传递一个将其声明为友元的类A的对象的指针。

  • 在函数内部,用强制转换获取这个对象的指针,然后就可以访问此对象的函数或者数据成员了,形式代码如下

  • A * pObjectOfA = (A *) lParam;    // 强制转换,获取A类对象指针pObjectOfA-》MemberMethod( );      // 调用A类对象的成员函数


声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,谢谢。

上一篇: 痛经快速止痛的小妙招,痛经快速止痛的几个小妙招(教你几招快速缓解)

下一篇: magic的名词是什么?magic是什么意思



推荐阅读

网站内容来自网络,如有侵权请联系我们,立即删除! | 软文发布 | 粤ICP备2021106084号