wjt810907
驱动中牛
驱动中牛
  • 注册日期2004-08-18
  • 最后登录2011-04-16
  • 粉丝0
  • 关注0
  • 积分86分
  • 威望409点
  • 贡献值1点
  • 好评度402点
  • 原创分2分
  • 专家分0分
阅读:1352回复:6

SOS! _beginthread函数问题

楼主#
更多 发布于:2007-03-01 14:00
  SOS! _beginthread函数在win32程序下语句  
_beginthread(TransferThread,0,&outThreadControl)没问题  ,但是在mfc下编译出错!

win32下程序

    _beginthread(TransferThread,0,&outThreadControl);
TransferThread函数定义:
     void TransferThread(PTHREAD_CONTROL threadControl)

//Send the iocontrol signal to driver
void TransferThread(PTHREAD_CONTROL threadControl)
{
    int i;
    i=0;
   // perform the IO transfer
   threadControl->status =  DeviceIoControl (threadControl->hDevice,
                                             threadControl->Ioctl,
                                             threadControl->InBuffer,
                                             threadControl->InBufferSize,
                                             threadControl->OutBuffer,
                                             threadControl->OutBufferSize,
                                             &threadControl->BytesReturned,
                                             NULL);
   // if an event exists, set it
   if (threadControl->completionEvent)
      SetEvent(threadControl->completionEvent);
   return;
}

 程序正确!

而在mfc下出错:不能转化类型PTHREAD_CONTROL  to (void *)

我改成这样就好了:

TransferThread函数定义:

void    TransferThread(void * m_thptr);

void  TransferThread(void * m_thptr)
{
    //struct _THREAD_CONTROL * threadControl=(struct _THREAD_CONTROL *)m_thptr;
   // perform the IO transfer
   ((struct _THREAD_CONTROL *)m_thptr)->status =  DeviceIoControl (
                                             ((struct _THREAD_CONTROL *)m_thptr)->hDevice,
                                             ((struct _THREAD_CONTROL *)m_thptr)->Ioctl,
                                             ((struct _THREAD_CONTROL *)m_thptr)->InBuffer,
                                             ((struct _THREAD_CONTROL *)m_thptr)->InBufferSize,
                                             ((struct _THREAD_CONTROL *)m_thptr)->OutBuffer,
                                             ((struct _THREAD_CONTROL *)m_thptr)->OutBufferSize,
                                             &((struct _THREAD_CONTROL *)m_thptr)->BytesReturned,
                                             NULL);
   // if an event exists, set it
   if (((struct _THREAD_CONTROL *)m_thptr)->completionEvent)
      SetEvent(((struct _THREAD_CONTROL *)m_thptr)->completionEvent);
   return ;
}

请问是为什么???
大虾指点迷津!!
mcu_boy
wjt810907
驱动中牛
驱动中牛
  • 注册日期2004-08-18
  • 最后登录2011-04-16
  • 粉丝0
  • 关注0
  • 积分86分
  • 威望409点
  • 贡献值1点
  • 好评度402点
  • 原创分2分
  • 专家分0分
沙发#
发布于:2007-03-05 09:57
没人理,自己顶一下
mcu_boy
wjt810907
驱动中牛
驱动中牛
  • 注册日期2004-08-18
  • 最后登录2011-04-16
  • 粉丝0
  • 关注0
  • 积分86分
  • 威望409点
  • 贡献值1点
  • 好评度402点
  • 原创分2分
  • 专家分0分
板凳#
发布于:2007-03-06 08:35
有没有人知道?指点一下啊
mcu_boy
pilixuanke
驱动中牛
驱动中牛
  • 注册日期2005-10-31
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1018分
  • 威望626点
  • 贡献值0点
  • 好评度512点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-03-09 09:25
第一点:注意下面两个函数原型中红色的地方
uintptr_t _beginthread(
   void( __cdecl *start_address )( void * ),
   unsigned stack_size,
   void *arglist
);
uintptr_t _beginthreadex(
   void *security,
   unsigned stack_size,
   unsigned ( __stdcall *start_address )( void * ),
   void *arglist,
   unsigned initflag,
   unsigned *thrdaddr
);

第二点:线程函数的参数为void*,你不能用PTHREAD_CONTROL类型作为它的参数类型,这样在连接时会出错,因为类型不匹配。可以如下:
原型:void   __cdecl TransferThread(void * m_thptr);
函数:void __cdecl TransferThread(void * m_thptr)
{
  struct _THREAD_CONTROL * threadControl=(struct _THREAD_CONTROL *)m_thptr;

  // perform the IO transfer
  ((struct _THREAD_CONTROL *)m_thptr)->status = DeviceIoControl (
                              threadControl->hDevice,
                              threadControl->Ioctl,
                              threadControl->InBuffer,
                              ...
  

Good Luck
向底层开发进军!!!
wjt810907
驱动中牛
驱动中牛
  • 注册日期2004-08-18
  • 最后登录2011-04-16
  • 粉丝0
  • 关注0
  • 积分86分
  • 威望409点
  • 贡献值1点
  • 好评度402点
  • 原创分2分
  • 专家分0分
地下室#
发布于:2007-03-09 12:42
那大虾知道为什么在win32下“用PTHREAD_CONTROL类型作为它的参数类型”正确呢?
mcu_boy
pilixuanke
驱动中牛
驱动中牛
  • 注册日期2005-10-31
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1018分
  • 威望626点
  • 贡献值0点
  • 好评度512点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-03-09 13:00
引用第4楼wjt8109072007-03-09 12:42发表的“”:
为什么在win32下“用PTHREAD_CONTROL类型作为它的参数类型”正确呢?


不太清楚,可能编译选项不太一样,对类型检查不是太严格。
向底层开发进军!!!
wjt810907
驱动中牛
驱动中牛
  • 注册日期2004-08-18
  • 最后登录2011-04-16
  • 粉丝0
  • 关注0
  • 积分86分
  • 威望409点
  • 贡献值1点
  • 好评度402点
  • 原创分2分
  • 专家分0分
6楼#
发布于:2007-03-09 13:13
这个问题折腾好久了,还是解决了(虽然不知原因),谢谢上楼的大虾了!
mcu_boy
游客

返回顶部