一个跟线程同步类似的问题,请各位帮帮看看出错原因

scsnsjsl_cs_dn 2009-03-02 09:25:59
加精
有代码如下:
bool g_IsReadThreadFinish = true;

DWORD WINAPI ReadData(LPVOID lpParameter)
{
g_IsReadThreadFinish = false;//线程开始

//处理过程
.......;

g_IsReadThreadFinish = true;//线程结束

return 0;
}

CXXXDlg::OnBnClickedBtnSelect()
{
vector<string>::iterator iterator = vectorTab.begin();
while (iterator != vectorTab.end())
{
.......;

DWORD WINAPI ReadData(LPVOID lpParameter);
HANDLE handle=CreateThread(NULL,0,ReadData,NULL,0,NULL);
CloseHandle(handle);
g_IsReadThreadFinish = false;

while (!g_IsReadThreadFinish)
{
Sleep(200);
}
iterator++;
}
}


主线程的OnBnClickedBtnSelect()函数要连续几次通过创建相同线程进行处理,线程参数不一样
1.建线程后,将g_IsReadThreadFinish = false;
2.在线程处理函数中g_IsReadThreadFinish = false;
3.线程处理函数结束,g_IsReadThreadFinish = true;
4.主现成开启线程后进入
while (!g_IsReadThreadFinish)
{
Sleep(200);
}
等待;


这样看起来没有出问题,

可是调试的时候,怎么第一个线程都还没处理完,主线程又开启第二个线程了呢?
请指点!!!
...全文
1280 79 打赏 收藏 转发到动态 举报
写回复
用AI写文章
79 条回复
切换为时间正序
请发表友善的回复…
发表回复
StonesHeart 2011-11-07
  • 打赏
  • 举报
回复
学习了,希望有人介绍系统的这方面的知识。
smwhotjay 2011-04-15
  • 打赏
  • 举报
回复
CreateThread是异步的.即创建个thread. 但那个thread里的代码如果只是return 0; 可能CreateThread执行下一步时,这thread就销毁了.可能thread还刚入口.. 一般的办法是阻塞thread.
qzl123666 2009-03-06
  • 打赏
  • 举报
回复
楼主我很不明白你的意图!
首先你是不是想启动一个后台线程帮你处理vectorTab里面的数据。
如果是的话什么需要处理一个vectorTab里面的元素就创建一个线程。
其实一开是的while循环就可以放在后台线程中的。
然后你说第一个线程还未执行完就产生第二个线程,这个问题我使过了好像是不会出现的。代码如下:
bool g_IsReadThreadFinish = true;

DWORD WINAPI ReadData(LPVOID lpParameter)
{
int r=(int)lpParameter;
g_IsReadThreadFinish = false;//线程开始

cout<<"线程"<<r<<"执行当中!"<<endl;

g_IsReadThreadFinish = true;//线程结束
cout<<"线程"<<r<<"结束!"<<endl;
return 0;
}
void main()
{
int i=0;
while(1)
{
HANDLE threadHandle=CreateThread(NULL,0,ReadData,(LPVOID)i,0,NULL);
CloseHandle(threadHandle);
g_IsReadThreadFinish=false;
while (!g_IsReadThreadFinish)
{
Sleep(200);
}
i++;
}
}
还有上面所说的使用互斥量,其实是你使用的不正确,你的互斥不应该是和主线程互斥,而是后台线程中的互斥。
直接将你主线程中的waitforsingleobject和releasemutex函数去掉即可。
sdhzzzzcd 2009-03-05
  • 打赏
  • 举报
回复
为什么不用回调函数进行显示?速度应该也不慢
mumubusu 2009-03-05
  • 打赏
  • 举报
回复
多线程同时操作一个变量会出问题的
mumubusu 2009-03-05
  • 打赏
  • 举报
回复
::InitializeCriticalSection(&m_CriticalSectionLock);

::EnterCriticalSection(&m_CriticalSectionLock);
g_IsReadThreadFinish = false;
::LeaveCriticalSection(&m_CriticalSectionLock);
xiaokunshuai 2009-03-05
  • 打赏
  • 举报
回复
sleep()函数时间太长,而且该函数运行后程序暂停,包括主线成。可以试试Getendcode函数。
xiaokunshuai 2009-03-05
  • 打赏
  • 举报
回复
sleep()函数时间太长,而且该函数运行后程序暂停,包括主线成。可以试试Getendcode函数。
xiaokunshuai 2009-03-05
  • 打赏
  • 举报
回复
sleep()函数时间太长,而且该函数运行后程序暂停,包括主线成。可以试试Getendcode函数。
linsect 2009-03-05
  • 打赏
  • 举报
回复
学习学习!!!
fangsp 2009-03-05
  • 打赏
  • 举报
回复
学习了
Kudeet 2009-03-05
  • 打赏
  • 举报
回复
无语了......
jack15622 2009-03-04
  • 打赏
  • 举报
回复
真的有点看不懂啊 好象进错地方了
szy41 2009-03-04
  • 打赏
  • 举报
回复
mark
glunoy 2009-03-04
  • 打赏
  • 举报
回复
看错 while。。。
glunoy 2009-03-04
  • 打赏
  • 举报
回复
while (iterator != vectorTab.end())
{
.......;

DWORD WINAPI ReadData(LPVOID lpParameter);
HANDLE handle=CreateThread(NULL,0,ReadData,NULL,0,NULL);
CloseHandle(handle);
g_IsReadThreadFinish = false;

while (!g_IsReadThreadFinish)
{
Sleep(200);
}
iterator++;
}
你这段代码有问题 当然会不停创建啦。
你简化一下看看?
while(p->next!= null)
{
createthread;
nn = false;
if(!nn) sleep(200)
p = p->next;
}
你这段代码的意思是 如果p不为空 创建线程 等待200毫秒 p指向下一个对象
如果下一个对象有 那么接着创建线程。。在200毫秒。。如此重复。
这么多高手 难道都没有看出来吗?
你们的解决方法我不懂。
但是这段代码它就是会不停创建。
华亭真人 2009-03-04
  • 打赏
  • 举报
回复
无语了....
scsnsjsl_cs_dn 2009-03-04
  • 打赏
  • 举报
回复
我在ReadData线程里,没有使用SendMessage,也没PostMessage,
而是在ReadData线程通过GetDlgItem来获取CListCtrl的,进而向CListCtrl中插入数据,请问这算界面相关吗?
scsnsjsl_cs_dn 2009-03-04
  • 打赏
  • 举报
回复
[Quote=引用 53 楼 laiyiling 的回复:]
如果楼主的数据线程里面没有去操作CListCtrl,是可以用WaitForSingleObject的,但是线程中一旦用了SendMessage之类的方法就不行了
[/Quote]

我在ReadData线程里,没有使用SendMessage,也没PostMessage,
而是在GetDlgItem来获取CListCtrl的,进而向CListCtrl中插入数据,请问这算界面相关吗?
scsnsjsl_cs_dn 2009-03-04
  • 打赏
  • 举报
回复
兄弟,麻烦文明点,咱们知识在探讨,又不是在吵架

请你先看清楚问题再说,现在的问题是ReadData线程运行到到中间的时候出现2个线程阻塞的问题,二不是你所说的
加载更多回复(56)

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧