社区
进程/线程/DLL
帖子详情
多线程的问题:为什么改一个BOOL量会失败?在线等
Kaile
2005-10-24 08:05:41
一个线程对象正在跑,做一些科学计算工作,现在需要按一个按钮将这个对象的数据成员bExit由FALSE改为TRUE,以实现计算中断,结果发现没有任何效果。
请教,简捷的实现方法是什么?
谢谢。
...全文
233
13
打赏
收藏
多线程的问题:为什么改一个BOOL量会失败?在线等
一个线程对象正在跑,做一些科学计算工作,现在需要按一个按钮将这个对象的数据成员bExit由FALSE改为TRUE,以实现计算中断,结果发现没有任何效果。 请教,简捷的实现方法是什么? 谢谢。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
bm1408
2005-10-25
打赏
举报
回复
你要重载消息处理的函数了,
我以前也遇到一个这样的问题,实在搞不定,我来
goodname008
2005-10-25
打赏
举报
回复
无论你在任何地方修改 bContinue 变量的值,都要做好线程同步,切记切记。
不然程序复杂了以后会很难排查错误。
Kaile
2005-10-25
打赏
举报
回复
感谢,发现是我的问题,我还有另外一个地方在SetExitFlag(TRUE)以后又将它变为FALSE,因为是多线程,改了以后没发现,以为是没修改成功。
上面的代码很好,学习。
goodname008
2005-10-25
打赏
举报
回复
而我个人比较推荐这种作法:
#include "stdafx.h"
#include "windows.h"
#include "process.h"
#include <iostream>
using namespace std;
HANDLE hEvent = NULL;
BOOL bContinue = TRUE;
unsigned int __stdcall ThreadProc(LPVOID lpParameter)
{
while (true)
{
if (WaitForSingleObject(hEvent, 0) == WAIT_OBJECT_0)
{
break;
}
Sleep(100);
}
cout << "Thread terminated." << endl;
return 0;
}
int main(int argc, char* argv[])
{
hEvent = CreateEvent(NULL, TRUE, FALSE, "TestEvent");
UINT nThreadID = 0;
HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, ThreadProc, NULL, 0, &nThreadID);
int nInput = 0;
cin >> nInput;
if (nInput == 1)
{
SetEvent(hEvent);
}
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
if (hEvent)
{
CloseHandle(hEvent);
hEvent = NULL;
}
return 0;
}
goodname008
2005-10-25
打赏
举报
回复
输入1可以使ThreadProc线程结束。
否则主线程将会被ThreadProc永远阻塞住。
goodname008
2005-10-25
打赏
举报
回复
#include "stdafx.h"
#include "windows.h"
#include "process.h"
#include <iostream>
using namespace std;
CRITICAL_SECTION cs;
BOOL bContinue = TRUE;
unsigned int __stdcall ThreadProc(LPVOID lpParameter)
{
while (true)
{
EnterCriticalSection(&cs);
if (!bContinue)
{
break;
}
LeaveCriticalSection(&cs);
Sleep(100);
}
cout << "Thread terminated." << endl;
return 0;
}
int main(int argc, char* argv[])
{
InitializeCriticalSection(&cs);
UINT nThreadID = 0;
HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, ThreadProc, NULL, 0, &nThreadID);
int nInput = 0;
cin >> nInput;
if (nInput == 1)
{
EnterCriticalSection(&cs);
bContinue = FALSE;
LeaveCriticalSection(&cs);
}
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
DeleteCriticalSection(&cs);
return 0;
}
peiming_ge
2005-10-25
打赏
举报
回复
在改变标志前先把线程对象挂起,试试
CWinThread* pCalc
....
main::SetExitFlag()
{
pCalc->SuspendThread()
pCalc->m_bExit = TRUE;
pCalc->ResumeThread();
}
皮皮鲁
2005-10-24
打赏
举报
回复
应该不大会的
可能是因为SetExitFlag在测试if ( isTimeOut() || m_bExit )之后运行
请确保在测试之前,已经调用了SetExitFlag
Kaile
2005-10-24
打赏
举报
回复
不行啊,大哥,我加了volatile,发现还是没改过来。
这样定义:
volatile BOOL m_bExit ;
这是调用对象的方法来修改这个标志
CalcInstance.SetExitFlag(TRUE);
void Calc::SetExitFlag(BOOL bExit)
{
m_bExit = bExit;
}
在计算内部加
if ( isTimeOut() || m_bExit )
return ;
加断点,发现m_bExit仍然是FALSE
oyljerry
2005-10-24
打赏
举报
回复
用volatile 修饰,防止编译器作优化
然后线程中通过bCondition来跳出循环
ming6424
2005-10-24
打赏
举报
回复
同意楼上的!!!
皮皮鲁
2005-10-24
打赏
举报
回复
最简单的方法就是在你这个BOOL变量的定义前面加上volatile
如:
volatile BOOL bCondition;
gunney
2005-10-24
打赏
举报
回复
用临界区吧
【深度学习平台】AutoDL显卡租用进阶技巧:文件传输与代码编辑优化方案
内容概要:本文介绍了在使用AutoDL显卡租用平台时的进阶技巧,重点涵盖文件传输与代码编辑的高效方法。文件传输部分详细讲解了本地与平台间的两种方式:通过FileZilla软件使用SFTP协议进行可视化传输,以及通过网页端直接上传下载文件,并对比了各自的适用场景;同时还介绍了平台内部多实例之间的文件中转传输方法,利用挂载目录实现同区域实例间高效共享文件,提升工作效率。在代码编辑方面,文章分析了传统终端编辑和本地上传覆盖的局限性,并推荐使用JupyterLab网页界面进行
在线
代码编辑,操作简便且支持实时保存,适合频繁修
改
的开发场景。 适合人群:使用AutoDL平台进行深度学习开发的研究人员或爱好者,尤其是有一定平台使用经验、希望提升效率的用户;适合需要频繁传输文件或多实例协同工作的开发者。 使用场景及目标:①在本地与实例间选择合适的文件传输方式以提高效率;②实现多个实例间的快速文件共享,减少重复上传;③优化代码编写流程,避免反复上传文件,提升开发便捷性与流畅度。
个人网-个人事务管理系统(已停止维护)
【源码预览】:https://renmaiwang.cn/s/8z6ns (最新版、最全版本)个人网-个人事务管理系统(已停止维护)
vpclattice-jvm-1.4.11.jar
vpclattice-jvm-1.4.11.jar
bananas.zip
Bananas Screen Sharing 是一款基于 WebRTC 技术的开源屏幕共享工具,专注于跨平台支持(Windows、macOS 和 Linux)和极简的用户体验。
Kite 前台页面是vue ssr服务端渲染、后台页面是react spa、服务层nodejs express、mysql编写的一套多权限文章、动态管理系统
【源码预览】:https://renmaiwang.cn/s/4ubzg (最新版、最全版本) Kite 前台页面是vue ssr服务端渲染、后台页面是react spa、服务层nodejs express、mysql编写的一套多权限文章、动态管理系统
进程/线程/DLL
15,467
社区成员
49,171
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章