我有一个函数执行时间很长,在运行函数时程序无法响应,我想用多线程解决。思路是这样的:把这个函数放入一个线程执行,这个函数是执行一个循环,在这个循环里改变一个传入的全局变量的值,另外产生一个线程读这个全局变量的值,然后用一个进度条显示。我有几个问题不清楚:
1.在一个函数里的循环改变全局变量的值,另外一个线程能否及时读取它的值,例如函数:UINT display(UINT *current)
  {
     UINT i;
     for (i=0;i<10000;i++)
        *current=i;
     return 0;
   }
current是传入的一个全局变量,我在另外的线程能否读取它的值。
2.由于两个线程同时读取一个全局变量,如何进行同步?
解决一个问题50分。

解决方案 »

  1.   

    1.用event对象同步两个线程CEvent eventCurrentChange;//全局变量变化的事件
    CCriticalSection crCurrent;//互斥UINT display(UINT *current)
      {
         UINT i;
         for (i=0;i<10000;i++)
         {
            crCurrent.Lock();
            *current=i;
            crCurrent.Unlock();
            eventCurrentChange.SetEvent();
         }
         return 0;
       }另外一个线程while(eventCurrentChange.Lock())//等待事件发生(全局变量变化)
    {
        crCurrent.Lock();//访问全局变量
           ..//显示进度条
        crCurrent.Unlock();
    }2.如上,访问同一个变量的时候,用临界区crCurrent互斥,可以避免在写全局变量没有完成之前,另外一个线程读取这个变量。
    同时读取不需要互斥
      

  2.   

    不用,只需要在那个需要长时间执行的函数中(应该是个长时间的循环吧?),
    循环里面,加上这几句:MSG msg;
    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }就行。
      

  3.   

    to everandforever(Forever) :
    你说的我不大明白呀?
      

  4.   

    补充一句,不同于getmessage,peekmessage不会等待一个消息处理完成才返回!
      

  5.   

    如果要用everandforever方法处理消息:
    UINT display(UINT *current)
      {
         UINT i;
         for (i=0;i<10000;i++)
         {
            *current=i;
            MSG msg;
            while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
           {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
          }
         return 0;
       }
      

  6.   

    如果用everandforever方法,这样:UINT display(UINT *current)
      {
         UINT i;
         for (i=0;i<10000;i++)
         {
            *current=i;
            MSG msg;
            while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
            {
                 TranslateMessage(&msg);
                 DispatchMessage(&msg);
             }
          }
         return 0;
       }
      

  7.   

    比如你的函数里面有个循环:...
    MSG msg;
    for(;;)
    {
    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    ...
    }这样。
    ...
      

  8.   

    现在我的这个函数是在一个DLL里,麻烦事好象更大了,我能否在DLL里创建一个进度条显示进度?DLL是WIN32的,不支持MFC。怎么办呀?
      

  9.   

    dll不支持mfc可以直接用sdk的api显示进度条界面。
      

  10.   

    我又写了一个基于MFC的DLL,能够显示一个对话框,但是是模式的,我想在对话框中显示一个进度条,不知可行不?
      

  11.   

    to stonespace(stonespace):
    能给些这方面的资料吗?
      

  12.   

    sdk编程比较麻烦,如果你已经用mfc,还是mfc好。我都是看msdn,一般讲windows sdk编程的书都会讲dll的。
      

  13.   

    那我是要在DLL里写多线程了?to stonespace(stonespace) :你有QQ吗?我的是82699855
    能否先给分,我想先给你50分,问题解决后给完分再开帖给分。
      

  14.   

    我的qq坏了,申请新的又不成功。在dll中创建有界面线程,在CWinThread派生类的InitInstance中打开对话框。
      

  15.   

    我打算在主程序中用一个线程来调用这个DLL,现在这个DLL又开一个线程,有问题吗?
      

  16.   

    最好不要有太多的线程,主程序只需要直接调用dll的创建线程的函数。或者dll不要创建线程,而是引出dialog类,然后主程序调用AfxBeginThread创建线程。