自定义线程1中加入Sleep()之类的
还有不要在线程里写ListBox,最好是SendMessage给主线程。

解决方案 »

  1.   

    这不是线程同步.让多个线程同时运行,只需要不断的起线程就可以了,他们会自己独立的运行.
    zero100()兄所言极是,不要在线程里直接修改ListBox.如果多个线程同时要求修改Listbox,这才是你要考虑的同步问题.
      

  2.   

    线程同步的问题只是在对同一个变量操作时才会考虑.
     多线程大多用在很复杂的数学运算时才考虑,向ListBox循环写入信息不如给主线程投递消息PostMessage
      

  3.   

    可是PostMessage也无法避免用户界面停止接受用户相应的情况呀!
    我看到微软的例程里虽然启动多个线程,也仍然可以接受用户事件,可是我的程序为什么不能呢?
    是不是我的线程有什么问题?
      

  4.   

    你在线程中使用一下Sleep语句,这样就可以进行操作了。同时,你在线程中要使用阻塞操作,只有在情况满足的条件下才进行操作,
      

  5.   

    一定是你的程序写的有问题。不是多线程同步的问题。我觉得多线程在有对外设操作时比较有效,因为操作系统的线程调度机制会在一个线程让出对CPU的控制权时(比方说对外设操作时),将CPU的使用权给另一个线程。我猜想你的线程中并没有这个机会让出控制权,只有用zzh兄说的Sleep来让出CPU了。
      

  6.   

    使用Sleep后,我的线程不就停止了,让另外一个线程运行,这还叫什么多线程?
      

  7.   

    同意In355Hz的看法,主线程负责响应窗口消息,你可能是阻塞了主线程,其它线程是不会有影响的看看有没有死循环什么的?
      

  8.   

    同意In355Hz的看法,主线程负责响应窗口消息,你可能是阻塞了主线程,其它线程是不会有影响的看看有没有死循环什么的?
      

  9.   

    同意In355Hz的看法,主线程负责响应窗口消息,你可能是阻塞了主线程,其它线程是不会有影响的,看看有没有死循环什么的?
      

  10.   

    同意In355Hz的看法,主线程负责响应窗口消息,你可能是阻塞了主线程,其它线程是不会有影响的,看看有没有死循环什么的?
      

  11.   

    主要代码如下:(按钮函数)
    CThread1* pt1;
    pt1 = new CThread1();
    // pt1 = (CThread1*)AfxBeginThread(RUNTIME_CLASS(CThread1),THREAD_PRIORITY_LOWEST,0,0,NULL);
    if(!pt1->CreateThread(CREATE_SUSPENDED,0))
    {
    delete pt1;
    return;
    }
    pt1->SetOwner(this);
    pt1->SetThreadPriority(THREAD_PRIORITY_HIGHEST);
    pt1->ResumeThread();
    pt1->testfun();
    请各位大侠多多指教
      

  12.   

    你的代码有两点错误:
    1、(CThread1*)AfxBeginThread(RUNTIME_CLASS(CThread1),THREAD_PRIORITY_LOWEST,0,0,NULL);函数为你自动分配一个CThread1对象,并且创始化它,你不用调用pt1 = new CThread1();和pt1->CreateThread()。如果要创建后挂起,把dwCreateFlags设为CREATE_SUSPENDED就行了。结束线程时将会自动删除分配的CThread1对象。
    注,AfxBeginThread内部代码相当于执行了:
    CThread1 pThread = new CThread1;
    pThread->CreateThread(...)
    终止时调用了pThread->Delete()删除了RUNTIME对象
    2、pt1->testfun();是什么意思?如果要执行线程函数,pt1->ResumeThread();后线程函数将自动被子线程执行,不用自己调用(那样在主线程中又执行了一次)。
    最后,这段程序可以改为这样
    (不用重载CWinThread类):
    CWinThread* pThread = AfxBeginThread(YourThreadProc,(LPVOID)pYourThreadProcParam, THREAD_PRIORITY_HIGHEST, 0, CREATE_SUSPENDED, NULL);
    //在这做你的运行前处理...
    pThread->ResumeThread();
    //就行了,如果要在主线程中检测线程是否结束,可以调用
    if(WaitForSingleObject(pThread->m_hThread, 0) == WAIT_OBJECT_0) {
      //子线程已经结束。
    }
    else {
      //子线程尚未结束。
    }
    如果需要重载CWinThread类的话,注意运行时为m_pfnThreadProc和m_pThreadParams类成员赋以有效值。然后:
    CYourThread pThread = (CYourThread*)AfxBeginThread(RUNTIME_CLASS(CYourThread),THREAD_PRIORITY_HIGHEST,0,CREATE_SUSPENDED,NULL);
    和:
    CYourThread pThread = new CYourThread;
    pThread->CreateThread(CREATE_SUSPENDED,0,0);
    都可以。。
    其它的细致部分看看MSDN中的Res吧,相信会很有帮助的。
      

  13.   

    对不起,我看错了,第一个错误不存在。
    此外,漏了一点如果是直接用CWinThread要在构造函数中传入m_pfnThreadProc和m_pThreadParams。即:
    CWinThread pThread = new CWinThread(YourThreadProc,(LPVOID)pYourThreadParams);
    pThread->CreateThread(CREATE_SUSPENDED,0,0);
    当然,对于自己重载的CXXThread类,也可以在其他地方给CWinThread::m_pfnThreadProc和CWinThread::m_pThreadParams类成员赋值。