我的一个while循环要花费大量的时间使系统好象死机,如何在执行他的时候让操作系统响应其他的操作? 我的一个while循环要花费大量的时间使系统好象死机,如何在执行他的时候让操作系统响应其他的操作? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 把while循环所在的函数放到thread里面执行 有没有象powerbuilder一样在循环中加一个语句就可以啦? 在循环中加入 Sleep 函数,最好是开一个线程:AfxBeginThread 放在线程函数里。 把计算工作放在新的线程中,线程中注意添加Sleep(0)把时间片也交给其他线程 while{ ... GetMessage(...); DispatchMessage(...);} 通常这类不希望影响主线程的事情放在子线程中做,我写了一个子线程类,你从这儿继承就可以了。(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 消息处理程序 最简单的方法,是重载onidle() 函数,或多线程,应当没问题的,我做过。 请问VC++如何写一个控件? 创建向导的问题 VPN 代理适用我这种情况吗 人体行走模型 一个很有技术含量的问题!高手帮下忙吧!在自绘制的虚拟ListCtrl中取lItemlParam VC界面编程问题,算是菜鸟问题~~~~~ 紧急求助,关于graphics.h在vc中 OnInitDialog()问题 ▲▲▲(急!!!)有谁能提供BMP2GIF编码以及文件保存的代码啊? 用过boost消息队列的进来看看 如何获取一个字段被定义成有IDENTITY属性? 请教怎样判断一个ini文件是否存在???
{
...
GetMessage(...);
DispatchMessage(...);}
你可以把你要做的事情分成一步一步,然后放在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 消息处理程序