wince6.0下打开线程后变得很慢?

shagua0916 2011-08-03 10:43:36
平台,S3C2416

在基于DIALOG 的APP中,打开一个线程,里面做个加法,

BOOL CsdkThreadTestDlg::OnInitDialog()
{
m_pThread=AfxBeginThread(CommProc, this, THREAD_PRIORITY_NORMAL,0, CREATE_SUSPENDED, NULL); // 创建并挂起线程
m_pThread->ResumeThread(); // 恢复线程运行
}

UINT CommProc(LPVOID pParam) //用户线程函数
{
COMSTAT ComStat;
DWORD dwErrorFlags;
CsdkThreadTestDlg * p=(CsdkThreadTestDlg*)pParam;
while(1)
{
p->m_value.Format(__T("%d"),temp++);
}
return 0;
}

,打开后功能是正常的,可以看到值在变化,但整体很慢,对话框反应极慢,很卡,这是为什么?


...全文
122 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Johnny_Depp 2011-08-04
  • 打赏
  • 举报
回复
顺带问下我遇到的问题

在打开程序,或者从socket返回数据刷新界面的时候,有时候会很卡,或者干脆不动
但动一下鼠标,就能触发界面刷新

是为什么?
shagua0916 2011-08-04
  • 打赏
  • 举报
回复
但发现同样代码在XP下运行时,无需加SLEEP,不知是何原因
shagua0916 2011-08-04
  • 打赏
  • 举报
回复
很少遇到发个贴有这么多回应的,先谢谢了!
我试了一下,加个延时真的好使,与线程初始化位置无关
91program 2011-08-03
  • 打赏
  • 举报
回复
串口操作的代码,因为没有数据到时,肯定会挂起,当然不用Sleep。
QQ515311445 2011-08-03
  • 打赏
  • 举报
回复

BOOL CsdkThreadTestDlg::OnInitDialog()
{
m_pThread=AfxBeginThread(CommProc, this, THREAD_PRIORITY_NORMAL,0, CREATE_SUSPENDED, NULL); // 创建并挂起线程
m_pThread->ResumeThread(); // 恢复线程运行
}

UINT CommProc(LPVOID pParam) //用户线程函数
{
COMSTAT ComStat;
DWORD dwErrorFlags;
CsdkThreadTestDlg * p=(CsdkThreadTestDlg*)pParam;
while(1)
{
p->m_value.Format(__T("%d"),temp++);
Sleep(0);//把CPU的执行权先交出来让其它线程(如UI线程)使用,就不会卡了.
}
return 0;
}

northcan 2011-08-03
  • 打赏
  • 举报
回复
翻看了以前的一个串口操作的代码。
貌似有一个线程在一直读串口。没有Sleep.
界面也不卡。
楼主创建线程的位置不好,不能放到OnInitDialog里面。
这个时候如果界面上有很多按钮和控件。
肯定会发现,是一个一个慢慢出来的。
91program 2011-08-03
  • 打赏
  • 举报
回复
同意2L的

可以少延时一些,如Sleep(10),但不能没有延时。
wolong98 2011-08-03
  • 打赏
  • 举报
回复

UINT CommProc(LPVOID pParam) //用户线程函数
{
COMSTAT ComStat;
DWORD dwErrorFlags;
CsdkThreadTestDlg * p=(CsdkThreadTestDlg*)pParam;
while(1)
{
p->m_value.Format(__T("%d"),temp++); //这个地方应该添加延时
Sleep(500);
}
return 0;
}
northcan 2011-08-03
  • 打赏
  • 举报
回复

m_pThread=AfxBeginThread(CommProc, this, THREAD_PRIORITY_NORMAL,0, CREATE_SUSPENDED, NULL);
// 创建并挂起线程
m_pThread->ResumeThread(); // 恢复线程运行

把这个创建线程的语句,放到一个按钮里面。
界面还会那么卡吗?
现在这样做,UI线程还没有完全做好界面的初始化。
业务线程影响到了UI界面的初始绘制。
当我遇上-你 2011-08-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 northcan 的回复:]
呃,加个Sleep(0);可以。
不过上面说的串口读线程
while(1)
{
// ... 判断串口退出事件
ReadFile(...);
// ...
}
这个没有数据时,会挂起?
[/Quote]
看你怎么用,有中断接收,查询方式,呵呵
northcan 2011-08-03
  • 打赏
  • 举报
回复
呃,加个Sleep(0);可以。
不过上面说的串口读线程
while(1)
{
// ... 判断串口退出事件
ReadFile(...);
// ...
}
这个没有数据时,会挂起?

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧