Victor,我想问一下,下面这个线程我并没有放在Thread Object构件创建的线程中应用,而是直接放在窗体主程序的__fastcall Tjiemian::Tjiemian(TComponent* Owner)中了,我这样做可以吗?会有什么问题。用这种方实现中断是否可行。
当程序执行到等待同步事件的线程函数DWORD WINAPI intproc(LPVOID param)时,WaitForSingleObject(hSyncEvent,INFINITE);函数并没有执行到{if (mutex_event == 0)
handle_pendulum(); } 。
我很郁闷,帮我看看吧。谢谢!
DWORD WINAPI intproc(LPVOID param);
HANDLE hSyncEvent; //同步事件句柄
bool stopflag; //线程结束标志
//---------------------------------------------------------------------------
__fastcall Tjiemian::Tjiemian(TComponent* Owner)
: TForm(Owner)
{ //主函数中代码
HANDLE hSubThread;
DWORD idSubThread;
#ifdef GT_ISA
short nret=GT_Open(768,10); //打开运动控制器
#else
short nret=GT_Open(); //我用的是PCI卡,当建立通信时nret=0,表示命令成功执行。
#endif
if(nret)
{
//此处原来是return 0;函数不允许有返回值,所以我把它屏蔽了
}
//建立同步事件
hSyncEvent=CreateEvent(NULL,true,false,NULL);
if(hSyncEvent==INVALID_HANDLE_VALUE)
{
GT_Close();
//去掉一个 return 0;
}
//将应用程序的事件与底层中断相关连 ,向ISR设置同步事件,从而实现事件共享
nret=GT_SetIntSyncEvent(hSyncEvent);
if(nret)
{
GT_Close(); //做有效性检查
//去掉一个 return 0;
}
//设置中断时间
nret=GT_SetIntrTm(2000);
if(nret)
{
goto error_out;
}
//中断模式设为时间中断
nret=GT_TmrIntr();
//为了不阻塞自己创建并启动一个新的线程,开设中断服务线程
stopflag=false;
hSubThread=CreateThread(NULL,
0,
intproc, // the route handling interrupt新线程函数
NULL,//the parameter of intproc 新线程函数所用参数
0,
&idSubThread);
if(nret)
{
goto error_out;
}
//.......wait for interrupt
_getch();
error_out:
stopflag=true;
SetEvent(hSyncEvent); //唤醒中断线程
CloseHandle(hSubThread); //关闭中断线程
}
//下面是等待同步事件的线程函数
DWORD WINAPI intproc(LPVOID param)
{
ResetEvent(hSyncEvent); //确保事件处于nonsidnaled状态
while(1)
{
//waiting for interrupt happen
WaitForSingleObject(hSyncEvent,INFINITE);
if(stopflag)
break;
//add your code for handling intrerrupt event here
//.....
{if (mutex_event == 0)
handle_pendulum(); } // control route
ResetEvent(hSyncEvent); //复位同步事件
}
GT_SetIntSyncEvent(NULL);
//close Synchronize Event Handle
CloseHandle(hSyncEvent);
ExitThread(0);
return 0;
}
--------------------next---------------------
阅读(1133) | 评论(0) | 转发(0) |