Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2341691
  • 博文数量: 816
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-17 17:57
文章分类

全部博文(816)

文章存档

2011年(1)

2008年(815)

分类:

2008-12-17 18:05:36

      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) |
给主人留下些什么吧!~~