一个多线程的问题,请高手看看

briggen 2010-07-08 01:41:54
头文件中:
public:
CProgressCtrl m_progressctrl;
CProgressCtrl m_progressctrl2;
public:
afx_msg LRESULT OperatePrgessOne(WPARAM wParam,LPARAM lParam);
afx_msg LRESULT OpeatePrgessTwo(WPARAM wParam,LPARAM lParam);


源文件中
全局:
#define OPERATEPGRONE WM_USER + 100
#define OPERATEPGRTWO WM_USER + 101

HANDLE thread1;
HANDLE thread2;
HANDLE thread0;

DWORD WINAPI mainfun(LPVOID pParam); //线程函数
DWORD WINAPI asstfun(LPVOID pParam);
HWND g_hwnd;
int nCount = 0;

.....
ON_MESSAGE(OPERATEPGRONE,OperatePrgessOne)
ON_MESSAGE(OPERATEPGRTWO,OpeatePrgessTwo)
.....

void CMultiplyThreadProDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
//OnOK();
g_hwnd = GetSafeHwnd();

thread1 = CreateThread(NULL,0,mainfun,0,0,NULL);
thread2 = CreateThread(NULL,0,asstfun,0,0,NULL);

thread0 = CreateMutex(NULL,TRUE,NULL);

CloseHandle(thread1);
CloseHandle(thread2);


Sleep(5000);
CDialog::OnOK();

}

LRESULT CMultiplyThreadProDlg::OperatePrgessOne( WPARAM wParam,LPARAM lParam )
{
for (int i=0;i<100;i++)
{
m_progressctrl.SetPos(i);
}

return 1L;
}

LRESULT CMultiplyThreadProDlg::OpeatePrgessTwo( WPARAM wParam,LPARAM lParam )
{
for (int i=0;i<100;i++)
{
m_progressctrl2.SetPos(i);
}
return 1L;

}

DWORD WINAPI mainfun( LPVOID pParam )
{
HWND hwnd ;
hwnd = (HWND)pParam;
while(nCount<5)
{
WaitForSingleObject(thread0,5000);
SendMessage(g_hwnd,OPERATEPGRONE,0,0);
Sleep(100);
nCount++;
ReleaseMutex(thread0);
}
return 0;
}


DWORD WINAPI asstfun(LPVOID pParam)
{
while(nCount<5)
{
WaitForSingleObject(thread0,5000);
SendMessage(g_hwnd,OPERATEPGRTWO,0,0);
Sleep(100);
nCount++;
ReleaseMutex(thread0);
}
return 0;
}

编译能通过,但是无法实现两个进度条同时运动在效果,我分步调试,发现消息响应函数进不去,无论for循环中sleep多少秒都没用。
请高手指点
...全文
173 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
magic7004 2010-07-14
  • 打赏
  • 举报
回复
好乱,楼主自己搞搞清楚吧先
xpbhere 2010-07-14
  • 打赏
  • 举报
回复
程序是不是直接就退出了?
刚以为会等待5秒,“等待5秒”抹掉~
xpbhere 2010-07-14
  • 打赏
  • 举报
回复
程序是不是等待5秒就直接退出了而不响应这两个消息?
昨夜无风 2010-07-09
  • 打赏
  • 举报
回复
thread1 = CreateThread(NULL,0,mainfun,0,0,NULL);
thread2 = CreateThread(NULL,0,asstfun,0,0,NULL);

你给线程传进去的是0参数,框架怎么可能收到!!
Tidal_Choidi 2010-07-09
  • 打赏
  • 举报
回复
线程同步问题,学习之中......
castlater 2010-07-09
  • 打赏
  • 举报
回复
ON_MESSAGE(OPERATEPGRONE,OperatePrgessOne)
ON_MESSAGE(OPERATEPGRTWO,OpeatePrgessTwo)

这样编译不会出错吗,应该是
ON_MESSAGE(OPERATEPGRONE,&CMultiplyThreadProDlg::OperatePrgessOne)吧.

我是了一下,由于WaitForSingleObject()等待失败,所以会到5秒以后才会继续执行线程代码,消息是发出去了的,而且,消息函数也接到消息了




stonewater 2010-07-08
  • 打赏
  • 举报
回复
还有OperatePrgessOne和OperatePrgessTwo函数就你这写法只能同时只有一个在运行,等一个返回了,另一个才有机会运行,这也就是你看到的结果
stonewater 2010-07-08
  • 打赏
  • 举报
回复
两个进度条是独立的,那你两个线程用一个同步对象去同步干什么
雪影 2010-07-08
  • 打赏
  • 举报
回复
需要有消息循环才行啊。

BOOL bRet;
while((bRet = GetMessage( &msg, /*s_hEventWnd*/NULL, 0, 0 )) != 0)
{
if(bRet == -1)
{
//错误处理代码,通常是直接退出程序
break;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
muzizongheng 2010-07-08
  • 打赏
  • 举报
回复
工作线程里是没有消息泵的。 必须自己主动去get。
soswaidao 2010-07-08
  • 打赏
  • 举报
回复
楼主还不明白线程同步是什么意思

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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