如何用在程序里用的出错?
谢谢
谢谢
解决方案 »
- 急~ IE的OCX插件能否被HOOK ???
- 如何在一个对话框中显示保存在文件夹中的BMP图片
- 如何限定EDIT控件输入数据为"19991001"类型
- 问一下像excel等那种有格式的表格控件用什么结构来存储数据?
- 请问怎么得到我的程序或线程运行时间……非timegettime法.
- 如何在WTL中使用MFC的控件类。
- 会看汇编么,进来看看什么错误:程序出现内存不能访问错误,然后给出这个地址
- 关于Build选项的小问题。请高手指教。
- 菜鸟问题:与CFileFind类有关的!!
- installshield打包IE插件 dll只有384KB,怎么打包之后变成了7.5M,哪位大侠用过啊?
- 如何程序实现.wav到.mp3的转换?
- 来个有难度的问题!高手请进~~
?在线程里Sleep(n)不就可以了
我要用timer来实现检查数据是否完全
它的原形是这样的:
UNIT SetTimer(HWND hWnd,UINT uTimerID,UINT,uInterval, TIMERPROC fnTimerProc)
看看你自己调用时的参数如何?
{MSG msg;HTREEITEM warnitem;
int ty;
CQuneuew Qunenew;
CTreeCtrl *ctrl=(CTreeCtrl*)lpParameter;
BOOL tab=0;
::SetTimer(NULL,1,700,NULL);
while (GetMessage(&msg, NULL, 0, 0))
{
if(msg.message==WM_TIMER)
{
////////////
if(tab==TRUE)
{
tab=FALSE;
if(Qunenew.findFristitem()==FALSE) continue ;
while (Qunenew.FindNextitem(warnitem,ty))
{
ctrl->SetItemImage(warnitem ,2,2);
} }
else
{
tab=TRUE;
if(Qunenew.findFristitem()==FALSE) continue ; while (Qunenew.FindNextitem(warnitem,ty))
{
if(ty==0)
ctrl->SetItemImage(warnitem,1,1);
else
ctrl->SetItemImage(warnitem,0,0); } }
////////////////
}
if(msg.message ==2005)
{
Qunenew.Insert((HTREEITEM)msg.wParam ,(int)msg.lParam );
}
if(msg.message ==2006)
{
Qunenew.Delete((HTREEITEM)msg.wParam);
if((int)msg.lParam ==0)
{
ctrl->SetItemImage((HTREEITEM)msg.wParam,1,1);
}
else
{
ctrl->SetItemImage((HTREEITEM)msg.wParam,0,0);
} }
}
::KillTimer(NULL,1); return 0;
}
用Event和Sleep来处理线程的定时。
1,如果只是为了等待几秒钟,用Sleep完全可以,用GetTickCount和while循环是极不好的,那样就成了候先生所谓的“Busy Loop”了,CPU别的事就别干了。
2,如果你是想开一个子线程,定时检查一些东西(估计楼主是这意思),那么应该开启一个UI线程,UI线程里注册一个新窗口,然后就可以等着接收消息了,比如你想要的Timer消息。这是最正统的方法,较容易实现,找本多线程书随便看看就可以编程了。
我以前都是在进程里用TIMER,然后用同步技术转给线程,直接的没用过,
用GetTickCount和while循环是非常非常糟糕的,会造成CPU占用率居高不下的。
m_nTimerID = ::SetTimer(NULL, 0, 3000,TimerProc);
在定义函数:
static VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg,
UINT uIDEvent, DWORD dwTime);
在函数中: CConnectThread *pThread = (CConnectThread *)AfxGetThread();
if (uIDEvent == pThread->m_nTimerID)
{
·····
}
{MSG msg;
::SetTimer(NULL,1,700,NULL);
while (GetMessage(&msg, NULL, 0, 0))
{
if(msg.message==WM_TIMER)
{ //insert your code }
}
::KillTimer(NULL,1); return 0;
}
用CreateThread()启动线程就可以了