推扬网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
推扬网 门户 你问我答 查看内容

蒋婷婷:VC/MFC 动态创建多线程

2020-8-11 18:55| 发布者: admin| 查看: 24| 评论: 0

摘要: 曹星的回答: 1. 因为你是MFC程序,建议使用AfxBeginThread()来创建新线程。AfxBeginThread()的内部会做一些相应的初始化,再调用CreateThread()API。 线程处理函数也就是一个普通的函数,但是其声明形式有规定的 ...

曹星的回答:

1. 因为你是MFC程序,建议使用AfxBeginThread()来创建新线程。AfxBeginThread()的内部会做一些相应的初始化,再调用CreateThread()API。 线程处理函数也就是一个普通的函数,但是其声明形式有规定的,如下: DWORD WINAPI ThreadProc (LPVOID pParam); 线程函数的名字由你自己定,但是格式必须是什么这个声明形式。比如: DWORD WINAPI MyThreadFunction (LPVOID pParam) { // 函数体,这里你写你的处理代码。 // 只是在理解上,要注意的是,这个线程函数体里面的代码是 // 在新的线程中运行。虽然在源代码上,这里面的代码和其他的代码 // 存在于同一个文件中 } “可是要在程序运行的才创建的线程,要怎么处理呢”--》不明白你的这个子问题的意思。 新的线程都是在程序运行起来之后,由相应的创建函数创建的。没有哪个线程是在编译时创建的啊。 2. 同一个线程处理函数的代码可以被多个线程共享的。可就是说,你可以只定义一个线程函数。不同的线程创建起来后,运行相同的代码。可以通过传递不同的参数(这个参数可以在创建新线程时从外面传递进去),来让线程函数体内的代码有不同的运行逻辑。 DWORD WINAPI MyThreadFunction (LPVOID pParam /*线程的参数*/) { int nMyParam = (int)pParam; if ( 0 == nMyParam ) { ... } else if ( 1 == nMyParam ) { ...} else if (...) {...} } 对于线程函数的参数,它是LPVOID,但是你在外面可以给他传递一个整形,或者指针,然后在线程函数体内强制转型回来使用。真正使用什么数据类型,与你自己控制。 在理解上,也要注意理解多个线程运行同一份代码的意思。 如果多个线程的线程函数读写同一个全局变量或者访问同一个资源,就需要做同步控制。使用临界区,Mutex等同步对象来控制。 对于多线程的运行机制的理解,比较重要。 理解了之后,你才能游刃有余地控制它。要不然,很容易带来问题。

陈震东的回答:

1. 因为你是MFC程序,建议使用AfxBeginThread()来创建新线程。AfxBeginThread()的内部会做一些相应的初始化,再调用CreateThread()API。 线程处理函数也就是一个普通的函数,但是其声明形式有规定的,如下: DWORD WINAPI ThreadProc (LPVOID pParam); 线程函数的名字由你自己定,但是格式必须是什么这个声明形式。比如: DWORD WINAPI MyThreadFunction (LPVOID pParam) { // 函数体,这里你写你的处理代码。 // 只是在理解上,要注意的是,这个线程函数体里面的代码是 // 在新的线程中运行。虽然在源代码上,这里面的代码和其他的代码 // 存在于同一个文件中 } “可是要在程序运行的才创建的线程,要怎么处理呢”--》不明白你的这个子问题的意思。 新的线程都是在程序运行起来之后,由相应的创建函数创建的。没有哪个线程是在编译时创建的啊。 2. 同一个线程处理函数的代码可以被多个线程共享的。可就是说,你可以只定义一个线程函数。不同的线程创建起来后,运行相同的代码。可以通过传递不同的参数(这个参数可以在创建新线程时从外面传递进去),来让线程函数体内的代码有不同的运行逻辑。 DWORD WINAPI MyThreadFunction (LPVOID pParam /*线程的参数*/) { int nMyParam = (int)pParam; if ( 0 == nMyParam ) { ... } else if ( 1 == nMyParam ) { ...} else if (...) {...} } 对于线程函数的参数,它是LPVOID,但是你在外面可以给他传递一个整形,或者指针,然后在线程函数体内强制转型回来使用。真正使用什么数据类型,与你自己控制。 在理解上,也要注意理解多个线程运行同一份代码的意思。 如果多个线程的线程函数读写同一个全局变量或者访问同一个资源,就需要做同步控制。使用临界区,Mutex等同步对象来控制。 对于多线程的运行机制的理解,比较重要。 理解了之后,你才能游刃有余地控制它。要不然,很容易带来问题。

吴伟强的回答:

http://baike.baidu.com/view/1191444.htm 我一般使用这个函数产生线程 至于线程数多的问题 既然是有需求才产生线程 开销是无法避免的 使用CreateThread创建线程时 注意两个参数 一是程序入口参数 二是程序参数的参数

米兰的回答:

首先,你要用cwinthread class cmythread : public cwinthread { dword m_dwmytimer; } 然后,要增加响应timer的成员函数 afx_msg void ontimer(wparam idevent, lparam dwtime); void cmythread ::ontimer(wparam idevent, lparam dwtime) { if(idevent == m_dwmytimer) { //your job } } 最后,在线程初始化函数中设置定时器 bool cmythread::initinstance() { m_dwmytimer = ::settimer(null,null,5000,null); }


鲜花

握手

雷人

路过

鸡蛋

最新评论

热门推荐
最新资讯

广告服务|投稿要求|禁言标准|版权说明|免责声明|手机版|小黑屋|推扬网 ( 粤ICP备18134897号 )|网站地图

GMT+8, 2021-12-1 08:39 , Processed in 0.074021 second(s), 28 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

返回顶部