2009年09月04日 下午 08:23
先举个例: UINT BoxA(LPVOID pParam) } } ...... void CMyDlg::OnStart() CWinThread *pWriteB=AfxBeginThread(BoxB, this,, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); CWinThread *pWriteC=AfxBeginThread(BoxC, this,, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); 最大值之间可以增加或减小),2为信号量的最大值(也就是最大线程访问数目),比如此处设为2,表示此信号量最多只允许俩个线程同时拥有它,其它线程想要获得此信号量的 话只能等待这两个线程释放此信号量,或调用ReleaseSemaphore(semaphore.m_hObject,1,NULL)函数来增加信号量的值。WaitForSingleObject(semaphore.m_hObject,INFINITE)函 数调用后信号量的值自动减1,当减到0时,其它线程就不能再利用此信号量了。ReleaseSemaphore(semaphore.m_hObject,1,NULL)函数使信号量的值加1,当加到最大值时,信号量 的值不再增大,此函数成功时返回1,调用失败时返回0,当信号量计数器已达到最大值时再调用此函数就会调用失败,或者此函数的第三个参数+此时信号量的值>最大值时也会调 用失败,调用失败的意思是忽略此函数,程序继续运行。 关于将类的成员函数作为线程: 文件1 UINT CVideoNetDlg::Thread_OpenViewDlg(LPVOID param) void CVideoNetDlg::OnView() 文件2 此段程序的目的是在处理函数OnView()时,获得信号量semaphore后再调用CviewDlg类的模式对话框(其实是这样的,点击某个菜 单弹出对话框,但是这个对话框初始化时必须要利用数组CViewDlg::clientdata的数据,而这个数组是在点击这个菜单时发送某代码到远程 机,再从远程机返回的数据得到赋值的。) 另外,此线程Thread_OpenViewDlg(LPVOID param)为类CVideoNetDlg的静态成员函数,但是很显然它使用了类CVideoNetDlg的非静态公有成员viewdlg,这就是利用 this指针在***.OnView()函数中将CVideoNetDlg的对象***传递给了param参数,在通过 (CVideoNetDlg*)param将LPVOID类型转换为CVideoNetDlg,执行CVideoNetDlg *dlg后dlg已经成了CVideoNetDlg的对象并获得了***的指针,这样就可以调用其成员viewdlg了。 最后,为什么将信号量和线程放在一起来分析,其实信号量就是线程编程,自己“做”一个信号量也是很简单的事情:分配一个额外的线程,在这个线程中用 while循环来检测你自定义的信号量的变化,由于while在单独的线程中执行,它不会影响主线程运行的。vc专门用这种机制只不过是来简化编程罢了 (个人愚见...)。 |
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25897606/viewspace-704805/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/25897606/viewspace-704805/