【发布时间】:2010-04-29 11:07:42
【问题描述】:
我正在学习线程和多线程..所以我刚刚创建了一个小应用程序,我将在其中更新 进度条和使用线程的静态文本。我从用户那里得到两个输入,开始值和结束值 循环应该旋转多长时间。我的应用程序中有 2 个线程。
Thread1-更新进度条(根据循环)将显示计数(循环计数)的静态文本。 Thread2 - 更新另一个仅显示名称的静态文本
基本上,如果用户单击开始,进度条会增加,同时文件计数和名称会并行显示。 还有另一个操作,如果用户点击暂停它(线程)必须暂停,直到用户点击恢复。 问题是,以上对于两个线程都不起作用(不会暂停和恢复)..但适用于单线程。 请检查代码以获得想法并回复我可以做什么!
点击按钮开始
void CThreadingEx3Dlg::OnBnClickedStart()
{
m_ProgressBar.SetRange(start,end);
myThread1 = AfxBeginThread((AFX_THREADPROC)MyThreadFunction1,this);
myThread2 = AfxBeginThread((AFX_THREADPROC)MyThreadFunction2,this);
}
线程1
UINT MyThreadFunction1(LPARAM lparam)
{
CThreadingEx3Dlg* pthis = (CThreadingEx3Dlg*)lparam;
for(int intvalue =pthis->start;intvalue<=pthis->end; ++intvalue)
{
pthis->SendMessage(WM_MY_THREAD_MESSAGE1,intvalue);
}
return 0;
}
线程1函数
LRESULT CThreadingEx3Dlg::OnThreadMessage1(WPARAM wparam,LPARAM lparam)
{
int nProgress= (int)wparam;
m_ProgressBar.SetPos(nProgress);
CString strStatus;
strStatus.Format(L"Thread1:Processing item: %d", nProgress);
m_Static.SetWindowText(strStatus);
Sleep(100);
return 0;
}
线程2
UINT MyThreadFunction2(LPARAM lparam)
{
CThreadingEx3Dlg* pthis = (CThreadingEx3Dlg*)lparam;
for(int i =pthis->start;i<=pthis->end;i++)
{
pthis->SendMessage(WM_MY_THREAD_MESSAGE2,i);
}
return 0;
}
线程2函数
LRESULT CThreadingEx3Dlg::OnThreadMessage2(WPARAM wparam,LPARAM lparam)
{
m_Static1.GetDlgItem(IDC_STATIC6);
m_Static1.SetWindowTextW(L"Thread2 Running");
Sleep(100);
m_Static1.SetWindowTextW(L"");
Sleep(100);
return TRUE;
}
void CThreadingEx3Dlg::OnBnClickedPause()
{
// TODO: Add your control notification handler code here
if(!m_Track)
{
m_Track = TRUE;
GetDlgItem(IDCANCEL)->SetWindowTextW(L"Resume");
myThread1->SuspendThread();
WaitForSingleObject(myThread1->m_hThread,INFINITE);
myThread2->SuspendThread();
m_Static.SetWindowTextW(L"Paused..");
}
else
{
m_Track = FALSE;
GetDlgItem(IDCANCEL)->SetWindowTextW(L"Pause");
myThread1->ResumeThread();
myThread2->ResumeThread();
/*myEventHandler.SetEvent();
WaitForSingleObject(myThread1->m_hThread,INFINITE);*/
}
}
【问题讨论】:
-
您说问题在于线程没有正确挂起/恢复,但您没有向我们展示处理“暂停”和“恢复”按钮点击的代码。
-
除此之外,我知道您这样做是为了学习线程,但这似乎是一项更适合计时器的任务。
-
另外,你说它“不起作用”。它以什么方式不起作用?它会崩溃吗?停止响应?就继续更新显示?
-
它只是冻结了无限时间!说没有响应
标签: multithreading mfc