原创 线程设计的一点感受

2009-4-13 21:13 2528 11 11 分类: 软件与OS

  我在使用界面库的是有,网址http://www.codeproject.com/KB/tree/coptiontree.aspx,里面的界面做的确实不错,但是对于控件消息的传递做的并不够好,硬起来很不方便。自己又不愿意去用vc6.0(哎,其实vs8.0)里面的界面控件已经有很多的提高。自己就像自己添加消息的处理函数,于是便想起来的线程的使用。上面的库对于消息的处理,面向用户的只有
OT_NOTIFY_INSERTITEM        // Insert item
OT_NOTIFY_DELETEITEM // Delete item
OT_NOTIFY_DELETEALLITEMS // Delete all items
OT_NOTIFY_ITEMCHANGED // Item changed
OT_NOTIFY_ITEMBUTTONCLICK // Item button click
OT_NOTIFY_SELCHANGE // Selection changed
OT_NOTIFY_ITEMEXPANDING // Item expanding
OT_NOTIFY_COLUMNCLICK // Column click
OT_NOTIFY_PROPCLICK // Property click

真正用的只有
OT_NOTIFY_SELCHANGE这个消息,但是这个消息只是对于的ITEM有作用,对于
想下面的图里面的控件,像CCOMBOX,RADIO等等
就不能够进行简单的像MFC下对话框那样进行消息处理,所以我做的时候就自己使用线程在创建ITEM
以后,创建线程,例如:
m_ItemRoot = m_OptionTree.InsertItem(new COptionTreeItem(),NULL);
m_ItemRoot->SetInfoText(_T("视频格式"));
m_ItemRoot->SetLabelText(_T("视频格式"));

otiCombo_cameraresolution = (COptionTreeItemComboBox*)m_OptionTree.InsertItem(new COptionTreeItemComboBox(), m_ItemRoot);
otiCombo_cameraresolution->SetLabelText(_T("视频格式"));
otiCombo_cameraresolution->SetCtrlID(IDC_CAMERA_RESULOTION);
if (otiCombo_cameraresolution->CreateComboItem(CBS_SORT)==TRUE)
{
otiCombo_cameraresolution->AddString(_T("1280 X 1024"));
otiCombo_cameraresolution->AddString(_T("640 X 512"));
otiCombo_cameraresolution->AddString(_T("320 X 256"));
otiCombo_cameraresolution->SelectString(0,_T("1280 X 1024"));
}
//创建线程
AfxBeginThread(Thread_CameraResolution,otiCombo_cameraresolution);
//线程函数;
UINT Thread_CameraResolution(LPVOID pParam)
{
COptionTreeItemComboBox * combox= (COptionTreeItemComboBox*)pParam;
UINT oldsel = combox->GetCurSel();
UINT newsel = oldsel;
while (thread_run)
{
if (newsel == oldsel)
{
newsel = combox->GetCurSel();
}
else
{
newsel = combox->GetCurSel();
oldsel = combox->GetCurSel();
::Sleep(500); //如果不是用这句话,可以延缓界面的响应
AfxMessageBox("CAMERA_RESULOTION");
}
}
return 0;
}
这里面需要的注意的是;
1.
::Sleep(500); //如果不是用这句话,可以延缓界面的响应
不然你的鼠标只要动一下位置 ,就会响应
2.在程序的时候使用全局变量thread_run来结束进程,不然就会有错误产生。
3。不要一起开辟很多的进程,
#ifdef WM_CAMERA_RESULOTION
cwtthread_cameraresolution =AfxBeginThread(Thread_CameraResolution,otiCombo_cameraresolution);
cwtthreadActive = cwtthread_cameraresolution;
#endif
#ifdef WM_CAMERA_SNAPMODE
cwtthread_camerasnapmode =AfxBeginThread(Thread_CameraSnapMode,otiCombo_camerasnapmode,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);
#endif
#ifdef WM_CAMERA_TRIGGER
cwtthread_cameratrigger =AfxBeginThread(Thread_CameraTrigger,otiCombo_cameratrigger,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);
#endif
#ifdef WM_CAMERA_GAIN
cwtthread_cameragain =AfxBeginThread(Thread_CameraGain,otiSpinner_cameragain,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);
#endif
#ifdef WM_CAMERA_EXPOSAL
cwtthread_cameraexposel =AfxBeginThread(Thread_CameraExposal,otiSpinner_cameraexposel,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);
#endif
#ifdef WM_CAMERA_ADCLEVEL
cwtthread_cameraADClevel =AfxBeginThread(Thread_CameraAdcLevel,otiCombo_cameraADClevel,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);
#endif
#ifdef WM_CAMERA_BLKENABLE
cwtthread_camerablkenable = AfxBeginThread(Thread_CameraBlkEnable,otiCombo_camerablkenable,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);
#endif
#ifdef WM_CAMERA_BLK
cwtthread_camerablk =AfxBeginThread(Thread_CameraBlk,otiSpinner_camerablk,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);
#endif

但是如果所有的线程都在运行,程序就会推得很慢,可以设置一个当前活动的线程变量,在开启下一个进程的
时候将前面的进程挂起来

其实这样跑起来还是很费CPU 的,我早CSND上发了贴,
http://topic.csdn.net/u/20090413/18/64740abf-1a00-4614-b4a2-853692507bd8.html
一个网友告诉我一个解决办法 就是 确实有效 呵呵呵
不过还是不满意 我在想把进程关闭 试试 大家有啥意见 也提个意见
最好有时间还是自己写代码好啊,省的烦心

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
11
关闭 站长推荐上一条 /1 下一条