社区
进程/线程/DLL
帖子详情
AfxBeginThread 和 AfxEndThread 怎么用
fjlangzi
2009-10-12 04:28:53
窗口Initial时候
AfxBeginThread(ThreadCheckAlive,this);开启一个线程
怎样用 AfxEndThread()结束啊 ?
...全文
2241
14
打赏
收藏
AfxBeginThread 和 AfxEndThread 怎么用
窗口Initial时候 AfxBeginThread(ThreadCheckAlive,this);开启一个线程 怎样用 AfxEndThread()结束啊 ?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
14 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Olc
2012-04-01
打赏
举报
回复
不过暴力结束线程的话,很危险尤其是用TerminateThread(),很容易造成内存溢出的[Quote=引用 5 楼 的回复:]
引用 2 楼 feilinhe 的回复:
一般用这个函数不多,一般都是让线程自己执行到最后结束(return 0;)
或者使用暴力方式TerminateThread()直接结束线程
暴力方式怎么用?能不能也在WM_DESTROY 响应的时候去做呢??
[/Quote]
shenzhiwanghz
2009-10-23
打赏
举报
回复
1
[Quote=引用 3 楼 fjlangzi 的回复:]
AfxEndThread(0);
0是什么意思,还有这个函数能不能在 WM_DESTROY 响应的时候去做呢??
[/Quote]
AfxEndThread(0);是指该线程的退出码是0,主线程可以通过GetExitCodeThread获得。
sevencat
2009-10-17
打赏
举报
回复
AfxEndThread是在线程内部你啥时想退出就调用吧,具体代码我没仔细研究,但我想一般直接return也可以进行相关的清理工作。
hzy694358
2009-10-16
打赏
举报
回复
AfxEndThread()这个一般用的比较少,因为线程函数执行完后,就自动的结束了线程了,当然如果有什么情况需要在线程函数未结束时处理,可用这个函数.
fjlangzi
2009-10-16
打赏
举报
回复
没人能把 AfxEndThread()这个怎么配合AfxBeginThread()说清楚哦
A1erX
2009-10-12
打赏
举报
回复
顶楼上,TerminateThread会导致内线程的资源没有办法释放。只能在线程内部设置个标志位。候捷的WIN32多线程设计中已经说得非常清楚了。建议你去看下。
zpf82118
2009-10-12
打赏
举报
回复
EndThread用于线程内部自己结束
想要在外部结束线程的话,就设个线程结束标志,标志置位,使线程自动结束;
或者用TerminateThread强制结束,然后CloseHandle,但该方法不推荐使用。
fjlangzi
2009-10-12
打赏
举报
回复
[Quote=引用 4 楼 tangjie200566 的回复:]
有这个函数啊AfxEndThread(ThreadCheckAlive,this);
[/Quote]
不对啊
fjlangzi
2009-10-12
打赏
举报
回复
[Quote=引用 4 楼 tangjie200566 的回复:]
有这个函数啊AfxEndThread(ThreadCheckAlive,this);
[/Quote]
不对啊
fjlangzi
2009-10-12
打赏
举报
回复
[Quote=引用 2 楼 feilinhe 的回复:]
一般用这个函数不多,一般都是让线程自己执行到最后结束(return 0;)
或者使用暴力方式TerminateThread()直接结束线程
[/Quote]
暴力方式怎么用?能不能也在WM_DESTROY 响应的时候去做呢??
唐增辉
2009-10-12
打赏
举报
回复
有这个函数啊AfxEndThread(ThreadCheckAlive,this);
feilinhe
2009-10-12
打赏
举报
回复
一般用这个函数不多,一般都是让线程自己执行到最后结束(return 0;)
或者使用暴力方式TerminateThread()直接结束线程
fjlangzi
2009-10-12
打赏
举报
回复
AfxEndThread(0);
0是什么意思,还有这个函数能不能在 WM_DESTROY 响应的时候去做呢??
Ghost90
2009-10-12
打赏
举报
回复
CWinThread *pThread=AfxBeginThread(ThreadProc,this,THREAD_PRIORITY_NORMAL,NULL,NULL);
ThreadProc 为线程函数名
AfxEndThread用法
UINT ThreadProc(PVOID pParam)
{
AfxEndThread(0);
return 0;
}
使用VC++6.0实现的“操作系统”课程中的生产者-消费者问题
一、原理 生产者线程: while (true) 生产 wait(empty) wait(mutex) 将产品放入队列 signal(mutex) signal(full) end while 消费者线程: while (true) wait(full) wait(mutex) 从队列中取出产品 signal(mutex) signal(empty) 消费 end while 信号量full表示可消费的产品数量,empty代表空单元的数量(用于容纳新生产的产品),mutex用于互斥地访问产品队列。wait操作对应于P原语,表示可用资源数量加快(减慢)生产,减慢(加快)消费”来随机调整生产和消费的时间,以观察生产者或消费者线程阻塞的状况。 程序在VC++6.0下编译通过。
Create
Thread
创建多线程与单线程比较
仿多线程的效果一般有2种办法:第一种是通过定时器;第二种是启动多线程,不同模式下启动函数不同,mfc与API与WIN32下面注意点也是有区别的! VC启动一个新线程的三种方法,有需要的朋友可以参考下。 第一种
Af
xBe
gin
Thread
() 用
Af
xBe
gin
Thread
()函数来创建一个新线程来执行任务,工作者线程的
Af
xBe
gin
Thread
的原型如下: CWin
Thread
*
Af
xBe
gin
Thread
(
AF
X_
THREAD
PROC pfn
Thread
Proc, LPVOID lParam, int nPriority =
THREAD
_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );//用于创建工作者线程 返回值: 成功时返回一个指向新线程的线程对象的指针,否则NULL。 pfn
Thread
Proc : 线程的入口函数,声明一定要如下: UINT My
Thread
Function(LPVOID pParam),不能设置为NULL; pParam : 传递入线程的参数,注意它的类型为:LPVOID,所以我们可以传递一个结构体入线程. nPriority : 线程的优先级,一般设置为 0 .让它和主线程具有共同的优先级. nStackSize : 指定新创建的线程的栈的大小.如果为 0,新创建的线程具有和主线程一样的大小的栈 dwCreateFlags : 指定创建线程以后,线程有怎么样的标志.可以指定两个值: CREATE_SUSPENDED : 线程创建以后,会处于挂起状态,直到调用:Resume
Thread
0 : 创建线程后就开始运行. lpSecurityAttrs : 指向一个 SECURITY_ATTRIBUTES 的结构体,用它来标志新创建线程的安全性.如果为 NULL, 那么新创建的线程就具有和主线程一样的安全性. 如果要在线程内结束线程,可以在线程内调用
Af
xEn
d
Thread
. 一般直接用
Af
xBe
gin
Thread
(
Thread
Proc,this); 示例: UINT myproc(LPVOID lParam){CITTDlg *pWnd = (CITTDlg *)lParam; //将窗口指针赋给无类型指针pWnd->KMeansSegment(); //要执行的函数return 1;}void CITTDlg::KMeansSegment(){// 主要处理函数在这里写}void CITTDlg::OnKMeansSegment() //按钮点击执行{
Af
xBe
gin
Thread
(myproc, (LPVOID)this);//启动新的线程} 注意,工作者线程的函数必须是全局函数或静态成员函数,不能是普通的成员函数。 第二种Create
Thread
()函数原型为:HANDLECreate
Thread
( NULL, // 没有安全描述符 0, // 默认线程栈的大小 My
Thread
Proc, // 线程函数指针,即函数名 (LPVOID)&n, // 传递参数 NULL, // 没有附加属性 NULL // 不需要获得线程号码 ); Creat
Thread
,它返回的是一个句柄;如果不需要再监视线程,则用CloseHandle()关闭线程句柄。 线程的函数必须定义为: DWORD WINAPI My
Thread
Proc(LPVOID pParameter); 下面演示多线程操作控件,点击一个Button然后运行一个线程,将字符串显示在CEdit控件里面; 示例: .h头文件struct hS {CString Tmp;CTestDlg *hWnd; };//定义全局结构体,用来传递自定义消息DWORD WINAPI
Thread
Proc(LPVOIDlpParam);//线程函数声明,全局函数public: CString chtmp; struct hS *hTmp;protected: HANDLE m_h
Thread
;//线程句柄 CEdit m_Edit;.cpp实现文件//线程执行函数DWORD WINAPI
Thread
Proc(LPVOID lpParam){//在这里写处理函数struct hS *Tmp2;Tmp2 = (hS*)lpParam;// 操作: Tmp2->hWnd->m_Edit.SetWindowText( (LPTSTR)Tmp2->Tmp );}void CTestDlg::OnBnClickedButton1(){ hTmp->Tmp = chtmp; hTmp->hWnd = this;//关键是把this指针传进去 m_h
Thread
=Create
Thread
(NULL,0,
Thread
Proc,hTmp,0,NULL);//创建新线程 CloseHandle(m_h
Thread
);} 用Create
Thread
()函数创建线程将返回一个线程句柄,通过该句柄你可以控制和操作该线程,当你不用时可以一创建该线程后就关闭该句柄,有专门的函CloseHandle()。关闭句柄不代表关闭线程,只是你不能在外部控制该线程(比如,提前结束,更改优先级等)。在线程结束后,系统将自动清理线程资源,但并不自动关闭该句柄,所以线程结束后要记得关闭该句柄。 第三种_be
gin
thread
() 函数原型为:intptr_t _be
gin
thread
( void( *start_address )( void * ), //指向新线程调用的函数的起始地址 unsigned stack_size, //堆栈大小,设置0为系统默认值 void *arglist //传递给线程函数的参数,没有则为NULL ); 返回值: 假如成功,函数将会返回一个新线程的句柄,用户可以像这样声明一个句柄变量存储返回值: HANDLE hStdOut = _be
gin
thread
( CheckKey, 0, NULL )。如果失败_be
gin
thread
将返回-1。所在库文件: #include 线程函数的定义: 对于_be
gin
thread
()创建的线程,其线程函数定义为: void
Thread
Pro(void * pArguments ); _be
gin
thread
ex()为_be
gin
thread
()的升级版。 总结:
Af
xBe
gin
Thread
是MFC的全局函数,是对Create
Thread
的封装。 Create
Thread
是Win32 API函数,
Af
xBe
gin
Thread
最终要调到Create
Thread
。而_be
gin
thread
是C的运行库函数。
MFC相关(三)MFC相关(三)
Af
xBe
gin
Thread
:开始一个新的线程
Af
xEn
d
Thread
:结束一个旧的线程
Af
xFormatString1:类似printf一般地将字符串格式化
Af
xFormatString2:类似printf一般地将字符串格式化
Af
xMessageBox:类似Windows API 函数 MessageBox
TCP 服务器端聊天
基于服务器端聊天系统 //·þÎñÆ÷Ïß³Ì UINT
thread
(LPVOID p) { char buff[100]; CSize size; size.cx=0; size.cy=30; int s=1,msgcount,loop=1,flag=0; CCSocketDlg *dlg=(CCSocketDlg*)
Af
xGetApp()->GetMainWnd(); //»ñµÃ¿Í»§¶ËÊýÁ¿ msgcount=dlg->getcount(); if (msgcount==-1) loop=0; if(loop) { s=1; dlg->msgsock[msgcount]=accept(dlg->sock,(sockaddr*)&(dlg->serv),&(dlg->addlen)); if (dlg->msgsock[msgcount]==INVALID_SOCKET) { dlg->m_edit.SetWindowText("Error accept"); } else { //Æô¶¯Ïß³Ì
Af
xBe
gin
Thread
(
thread
,0); dlg->SetForegroundWindow(); dlg->m_list.InsertItem(dlg->count++,"Á¬½Ó³É¹¦"); dlg->m_list.InsertItem(dlg->count++,inet_ntoa(dlg->serv.sin_addr)); dlg->m_list.Scroll(size); dlg->m_button.EnableWindow(TRUE); while(s!=SOCKET_ERROR) { //Ñ»·½ÓÊÕÊý¾Ý s=recv(dlg->msgsock[msgcount],buff,100,0); dlg->SetForegroundWindow(); if (s!=SOCKET_ERROR) { dlg->m_list.InsertItem(dlg->count++,buff); dlg->m_list.Scroll(size); dlg->sendtoall(dlg->msgsock[msgcount],buff); } } send(dlg->msgsock[msgcount],"Disconnected",100,0); dlg->m_list.InsertItem(dlg->count++,"Disconnected"); dlg->m_list.Scroll(size); dlg->msgsock[msgcount]=NULL; for (int i=0;i<50;i++) if (dlg->msgsock[i]!=NULL) flag=1; if (flag!=1) dlg->m_button.EnableWindow(FALSE); closesocket(dlg->msgsock[msgcount]); } } //ÖÕÖ¹Ïß³Ì
Af
xEn
d
Thread
(0); return 0; }
C++
Af
xBe
gin
Thread
和
Af
xEn
d
Thread
使用方法
启动线程: CWin
Thread
*
Af
xBe
gin
Thread
( 线程函数,this ); 线程的退出: 在刚刚使用的时候,退出线程的方法有问题,导致退出的时候异常。 下面说线程退出的方法: 1. 线程函数返回 线程都在死循环中,当满足一定条件时,return,也会将线程结束。 2.
Af
xEn
d
Thread
这个函数只能用在线程函数中,当满足一定条件是,调用。 举一个例子: 可以创建一个信号量...
进程/线程/DLL
15,471
社区成员
49,181
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章