使用Thread更新progress bar速度好慢

zerosam 2011-08-05 05:53:44
計劃是在按下按鈕後,開始燒入,然後progress bar會跑進度
目前遇到的問題是當按下按鈕後,會開始燒入,可是progress bar沒有更新的跡象,當燒完成後才會開始更新,不知道為什麼
請問題哪裡錯了??

以為是部份的代碼

//按鈕
void WRITEDlg::OnBnClickedButtonWrite()
{
m_pThread=AfxBeginThread(ProgressThread,this);//開始執行Thread
pAPICtrl->Write(pBuf, MAXSIZE); //這樣是燒入
MessageBox(_T("完成"));
}

//Thread
UINT CEEPROMDlg::ProgressThread(LPVOID pParam)
{

::PostMessage(AfxGetMainWnd()->m_hWnd,WM_CHICKBUTTON ,0,0);
return 0;
}

//消息函數
LRESULT CEEPROMDlg::OnChickButton(WPARAM wParam, LPARAM lParam)
{
SetTimer(TIMER1,200,NULL);
return true;
}

//定計器
void CEEPROMDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: Add your message handler code here and/or call default
TimeNum=TimeNum+10;
if(TimeNum<=100)
{
m_WriteProgress.StepIt();
}

CDialog::OnTimer(nIDEvent);
}
...全文
339 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
v_table 2011-08-15
  • 打赏
  • 举报
回复
就是在Dialog中写个更新PROGRESS BAR的函数,然后把这个函数地址传给线程。。
zerosam 2011-08-15
  • 打赏
  • 举报
回复
线程函数中执行UI的某个回调函数来更新PROGRESS BAR比较靠谱。。
=>請問要怎麼 回调函数来更新PROGRESS BAR 不了解
v_table 2011-08-12
  • 打赏
  • 举报
回复
UI线程正在执行WORK时已经阻塞住了,怎么可能处理消息呢,肯定是work完了才来处理消息,你在线程函数中执行UI的某个回调函数来更新PROGRESS BAR比较靠谱。。
zerosam 2011-08-12
  • 打赏
  • 举报
回复
::PostMessage(AfxGetMainWnd()->m_hWnd,WM_CHICKBUTTON ,0,0);
=>改成 ::PostMessage((HWND)pParam,WM_CHICKBUTTON ,0,0);

初學者第一次使用,不好意思。
要想讓它動只有邊燒邊更新bar!
就是燒一個地址更新一次.
=>可是燒錄是一支寫好的函数,我只是調用而已不能修改,所以不知道怎麼邊燒邊更新bar,所以才想用定時器更新bar。 所以這個想法是錯的嗎? 那要怎麼更新呢?
zerosam 2011-08-11
  • 打赏
  • 举报
回复
烧录使用后台线程来完成=> 這個意思是 燒錄由Thread來執行,progress bar則在button 中執行的意思嗎?

williamsong997 2011-08-11
  • 打赏
  • 举报
回复
樓主應該對Thread沒有了解.你搞了個定時器去更新progress bar,可是燒錄的進程剛開始你就把timer給kill 掉了. 哪個bar當然不會動了.

要想讓它動只有邊燒邊更新bar!
就是燒一個地址更新一次.
不然你還想怎樣?
Eleven 2011-08-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 buyong 的回复:]

UINT WRITEDlg::ProgressThread(LPVOID pParam)
{
::PostMessage(AfxGetMainWnd()->m_hWnd,WM_CHICKBUTTON ,0,0);
pZPBaseAPICtrl->Write_EEPROM(pTxBuf, ADDINDEX_MAXSIZE);//這是燒錄
return 0;
}

在线程函……
[/Quote]
最好不要这样用,你的线程函数不是有个LPVOID pParam参数吗?你创建的线程的时候将AfxGetMainWnd()->GetSafeHwnd()将主窗口的HWND窗口句柄作为线程函数的参数传递给线程即可
buyong 2011-08-11
  • 打赏
  • 举报
回复
UINT WRITEDlg::ProgressThread(LPVOID pParam)
{
::PostMessage(AfxGetMainWnd()->m_hWnd,WM_CHICKBUTTON ,0,0);
pZPBaseAPICtrl->Write_EEPROM(pTxBuf, ADDINDEX_MAXSIZE);//這是燒錄
return 0;
}

在线程函数里还能AfxGetMainWnd()->m_hWnd?我觉得这里有问题。
zerosam 2011-08-11
  • 打赏
  • 举报
回复
不好意思,我改了 烧录由Tread来执行,可是還是同樣的情況,不知道我哪裡有錯,可以幫我看一下嗎? 謝謝


//按鈕
void WRITEDlg::OnBnClickedButtonWrite()
{
HWND hWnd=GetSafeHwnd();
m_pThread=AfxBeginThread(ProgressThread,hWnd,THREAD_PRIORITY_NORMAL);//開始執行Thread
MessageBox(_T("完成"));
KillTimer(TIMER1);
}

//Thread
UINT WRITEDlg::ProgressThread(LPVOID pParam)
{
::PostMessage(AfxGetMainWnd()->m_hWnd,WM_CHICKBUTTON ,0,0);
pZPBaseAPICtrl->Write_EEPROM(pTxBuf, ADDINDEX_MAXSIZE);//這是燒錄
return 0;
}


//消息响应函数
LRESULT WRITEDlg::OnChickButton(WPARAM wParam, LPARAM lParam)
{
SetTimer(TIMER1,200,NULL);
return true;
}

//定計器
void CEEPROMDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: Add your message handler code here and/or call default
TimeNum=TimeNum+10;
if(TimeNum<=100)
{
m_WriteProgress.StepIt();
}

CDialog::OnTimer(nIDEvent);
}


oyljerry 2011-08-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zerosam 的回复:]
烧录使用后台线程来完成=> 這個意思是 燒錄由Thread來執行,progress bar則在button 中執行的意思嗎?
[/Quote]
progress bar放在主线程中,烧录由Tread来执行,然后烧录间隔中给主线程发送消息,主线程的消息响应函数中来更新ProgressBar
zzw820626 2011-08-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zerosam 的回复:]
烧录使用后台线程来完成=> 這個意思是 燒錄由Thread來執行,progress bar則在button 中執行的意思嗎?
[/Quote]
聪明啊,咋是繁体字?
zgl7903 2011-08-05
  • 打赏
  • 举报
回复
烧录使用后台线程来完成

16,471

社区成员

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

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

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