我的一个while循环要花费大量的时间使系统好象死机,如何在执行他的时候让操作系统响应其他的操作?

解决方案 »

  1.   

    把while循环所在的函数放到thread里面执行
      

  2.   

    有没有象powerbuilder一样在循环中加一个语句就可以啦?
      

  3.   

    在循环中加入 Sleep 函数,最好是开一个线程:AfxBeginThread 放在线程函数里。
      

  4.   

    把计算工作放在新的线程中,线程中注意添加Sleep(0)把时间片也交给其他线程
      

  5.   

    while
    {
        ...
        GetMessage(...);
        DispatchMessage(...);}
      

  6.   

    通常这类不希望影响主线程的事情放在子线程中做,我写了一个子线程类,你从这儿继承就可以了。(VC .NET环境)
    你可以把你要做的事情分成一步一步,然后放在SingleStep函数中做。
    //头文件
    #pragma once// CSubThreadclass CSubThread : public CWinThread
    {
    DECLARE_DYNCREATE(CSubThread)protected:
    CSubThread();           // 动态创建所使用的受保护的构造函数
    virtual ~CSubThread();public:

    //IniWork()是否返回的标志
    HANDLE m_hEventIni;

    //记录IniWork()和SingleStep()中是否遇到错误的标志
    bool blnCatchError;
    //错误描述
    CString strErrorString; //纯虚函数IniWork中执行初始化工作
    //返回0表示初始化工作成功,非0则表示失败
    //重载该函数时不必先调用父类的IniWork()
    virtual long IniWork();
    //纯虚函数SingleStep在m_hEventKill为Nonsignal状态时被不停地执行
    //返回值为0表示成功,非0表示失败
    //重载该函数时不必先调用父类的SingleStep()
    virtual long SingleStep(); //线程退出,在此做内存回收工作
    //重载该函数时先调用父类的Delete()
    virtual void Delete(); //该函数设置m_hEventKill为Signal状态,线程退出
    //返回值为0表示成功,非0表示失败
    //继承类不要重载该函数!!!
    long KillThread();public:
    virtual BOOL InitInstance();protected: //是否删除当前线程的标志
    HANDLE m_hEventKill;
    //当前线程是否已经删除的标志
    HANDLE m_hEventDead; DECLARE_MESSAGE_MAP()
    };
    //实现文件
    // SubThread.cpp : 实现文件
    //#include "stdafx.h"
    #include "SubThread.h"
    // CSubThreadIMPLEMENT_DYNCREATE(CSubThread, CWinThread)CSubThread::CSubThread()
    {
    blnCatchError = false;
    m_bAutoDelete = FALSE;
    //m_hEventKill、m_hEventDead创建并设为Nonsignal状态
    m_hEventKill = CreateEvent(NULL, TRUE, FALSE, NULL);
    m_hEventDead = CreateEvent(NULL, TRUE, FALSE, NULL);
    m_hEventIni = CreateEvent(NULL, TRUE, FALSE, NULL);
    }CSubThread::~CSubThread()
    {
    CloseHandle(m_hEventKill);
    CloseHandle(m_hEventDead);
    CloseHandle(m_hEventIni);
    }BOOL CSubThread::InitInstance()
    {
    // TODO: 在此执行任意逐线程初始化 //做初始化工作
    if( IniWork() )
    {
    //如果初始化出错,标志blnCatchError设为true
    blnCatchError = true;
    SetEvent(m_hEventIni);
    SetEvent(m_hEventDead);
    return FALSE;
    }
    //设置m_hEventIni为signaled,标志初始化工作完成
    SetEvent(m_hEventIni); while(WaitForSingleObject(m_hEventKill, 0) == WAIT_TIMEOUT)
    {
    //线程执行的动作
    //判断m_hEventKill是否为signaled,如果不是,执行虚函数SingleStep()
    //直到退出标志m_hEventKill为signaled
    if(SingleStep())
    {
    strErrorString = "An error occured in single step.";
    blnCatchError = true;
    SetEvent(m_hEventDead);
    return FALSE;
    }
    } SetEvent(m_hEventDead); //返回非,表示线程初始化失败,调用InitInstance退出线程
    return FALSE;
    }//虚函数IniWork中执行初始化工作
    //返回0表示初始化工作成功,非0则表示失败
    long CSubThread::IniWork()
    {
    return 0;
    }//虚函数SingleStep在m_hEventKill为Nonsignal状态时被不停地执行
    //返回值为0表示成功,非0表示失败
    long CSubThread::SingleStep()
    {
    return 0;
    }//该函数设置m_hEventKill为Signal状态,线程退出
    //返回值为0表示成功,非0表示失败
    //继承类不必重载该函数!!!
    long CSubThread::KillThread()
    {
    SetEvent(m_hEventKill); // allow thread to run at higher priority during kill process
    SetThreadPriority(THREAD_PRIORITY_ABOVE_NORMAL);
    //等待Delete()调用完毕
    WaitForSingleObject(m_hEventDead, INFINITE);
    WaitForSingleObject(m_hThread, INFINITE); // now delete CWinThread object since no longer necessary
    delete this; return 0;
    }//线程退出,在此做内存回收工作
    void CSubThread::Delete()
    {
    CWinThread::Delete();
    SetEvent(m_hEventDead);
    }BEGIN_MESSAGE_MAP(CSubThread, CWinThread)
    END_MESSAGE_MAP()
    // CSubThread 消息处理程序
      

  7.   

    最简单的方法,是重载onidle() 函数,或多线程,应当没问题的,我做过。