DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
CBarCodeList* pDlg = (CBarCodeList*)lpParameter;
int i=0;
//pos = TRUE;
while (1)
{
pDlg->m_progress.SetPos(i);
Sleep(20);
i++;
} return 0;
}
////创建线程
BOOL CBarCodeList::StatThread()
{

m_hThread = CreateThread(NULL,0,ThreadProc,this,0,&threadID); 
ResumeThread(m_hThread);
return 0;}
void CBarCodeList::OnBnClickedOk()
{



GetDlgItem(IDC_PROGRESS1)->ShowWindow(TRUE);

BOOL start = StatThread(); ///调用线程

         BOOL d_flag = BarCodeDataWrite(l_ItemText);////数据库写入
}
StatThread()创建了一个线程,在按钮单击事件里面调用这个函数,然后发现等BarCodeDataWrite(l_ItemText)运行完之后才运行线程函数,线程函数里面是进度条更新,如果不能显示出进度条更近进度,我些的进程就没有什么用处了。各位大侠帮忙啦!!!!

解决方案 »

  1.   

    BarCodeDataWrite可能阻塞主线程了,所以不能更新界面,你可以把BarCodeDataWrite放到另外一个线程中处理
      

  2.   

    创建线程的时候将UI的窗口句柄HWND传递给线程,在线程中SendMessage/PostMessage()发送自定义消息到UI线程,在UI线程的自定义消息响应函数中更新控件的信息即可~
      

  3.   

    “BarCodeDataWrite(l_ItemText)运行完之后才运行线程函数”
    你最好用一个事件(CreateEvent)来保证线程能够优先执行,让BarCodeDataWrite等待事件完成退出后在执行。
      

  4.   

    OnBnClickedOk
    这个是发送的消息
    这个消息不处理完,别的消息也不可能执行的。pDlg->m_progress.SetPos(i);
    这个也应该是消息处理的。
      

  5.   

    你的代码出现问题,是线程不同步造成的,按你的思路,可以用“事件”进行同步
    修改如下:
    1.在类CBarCodeList中增加个事件变量 m_hevent2。修改事件函数
       void CBarCodeList::OnBnClickedOk()
    {
        //建立手工触发、默认非激活 同步事件
    m_hevent = ::CreateEvent(NULL,TRUE,FALSE,NULL) 
       GetDlgItem(IDC_PROGRESS1)->ShowWindow(TRUE);
       BOOL start = StatThread(); ///调用线程   //等待 直到进度条开始更新了。
       ::WaitForSingleObject(m_hevent,INFINITE)   BOOL d_flag = BarCodeDataWrite(l_ItemText);////数据库写入
       ::CloseHandle(m_hevent);
    }
    3.修改 进度条 函数 
    DWORD WINAPI ThreadProc(LPVOID lpParameter)
    {
     CBarCodeList* pDlg = (CBarCodeList*)lpParameter;
     int i=0;
     //pos = TRUE;
     while (1)
     {
    //开始更新了通知 数据库写入可以开始了
     ::SetEvent(pDlg->m_hevent)
     pDlg->m_progress.SetPos(i);
     Sleep(20);
     i++;
     } return 0;
    }
      

  6.   

    放到循环外面
    DWORD WINAPI ThreadProc(LPVOID lpParameter)
    {
     CBarCodeList* pDlg = (CBarCodeList*)lpParameter;
     int i=0;
     //开始更新了通知 数据库写入可以开始了
     ::SetEvent(pDlg->m_hevent) //pos = TRUE;
     while (1)
     {

     pDlg->m_progress.SetPos(i);
     Sleep(20);
     i++;
     } return 0;
    }
      

  7.   


    pDlg->m_progress.SetPos(i);//发送重画消息给主线程,消息泵而主线程还在写数据并没有返回.