cpubbs论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

LabVIEW+单片机学习套件全套教程资料下载[免费]LabVIEW论坛精华列表贴USB0816数据采集卡《LabVIEW宝典》
LabWindows/CVI论坛精华贴NET0816以太网数据采集卡RC0210远程设备授权系统 关闭关停锁定打开设备 户外分布式数据采集
NET1624低速高精度以太网数据采集卡WIFI0824SD无线WIFI网络数据采集卡脱机运行 SD存储 小尺寸微型 串口采集远程采集 安卓 手持移动采集 纪录仪
查看: 1468|回复: 2

多线程的问题

[复制链接]
发表于 2009-11-2 23:07:42 | 显示全部楼层 |阅读模式
多线程的问题我正在编写多线程的软件,现在编译能通过,但点BEGIN时,出现下列问题,然后程序就崩溃了:

This thread or another thread is currently writing to the thread safe queue.


程序如下:

void CVICALLBACK ShowDataCallback (int Queue_Handle, unsigned int  event,int value, void *callbackData) ;//显示数据线程   
int CVICALLBACK GetDataThreadFunction ( void  *GetData) ;//获取数据线程

int FunctionID ;//线程调用函数ID
int Queue_Handle;//线程安全队列句柄


int CVICALLBACK BIGIN (int panel, int control, int event,
  void *callbackData, int eventData1, int eventData2)
{
switch (event)
  {
  case EVENT_COMMIT:

CmtScheduleThreadPoolFunction (DEFAULT_THREAD_POOL_HANDLE,GetDataThreadFunction, NULL, FunctionID);
CmtScheduleThreadPoolFunctionAdv (DEFAULT_THREAD_POOL_HANDLE,GetDataThreadFunction,NULL,
THREAD_PRIORITY_HIGHEST , NULL, NULL, NULL, NULL,FunctionID) ;   

//*创建一个容纳1000个字节数据的队列,需要的时候还可以扩大*/
CmtNewTSQ (1000, sizeof ( BYTE) , OPT_TSQ_DYNAMIC_SIZE, Queue_Handle) ;   
   
// 使用线程安全队列,并创建队列回调函数ShowData   
CmtInstallTSQCallback ( Queue_Handle,EVENT_TSQ_QUEUE_SIZE,100,ShowDataCallback,NULL,CmtGetCurrentThreadID(),NULL) ;  
CmtWaitForThreadPoolFunctionCompletion (DEFAULT_THREAD_POOL_HANDLE, FunctionID, 0);   
   
     
     
   break;
  }
return 0;
}
///////////////////////////////////////////////////////////////////////////////////////显示数据
void CVICALLBACK ShowDataCallback ( int Queue_HandleHandle, unsigned int   event,int value, void *callbackData)
{     
char ch[250]={""}, ss[250]={""},t[100],gg[250]={""};   
   
     BYTE data[500];
  
  
  CmtReadTSQData (Queue_Handle,data ,1, TSQ_INFINITE_TIMEOUT, 0); //写到data中

     sprintf(ch,"%02X ",data[0]);
            strcat(gg,ch);
  
         SetCtrlVal(panelHandle,PANEL_TEXTBOX,"0x");  
     SetCtrlVal(panelHandle,PANEL_TEXTBOX,gg);
     SetCtrlVal(panelHandle,PANEL_TEXTBOX,"\r\n");
     
}
///////////////////////////////////////////////////////////////////////////////////////获取数据      
CVICALLBACK GetDataThreadFunction ( void  *GetData) //获取数据线程        
{
while(1)     
{
CmtWriteTSQData (Queue_Handle,  kao, 1, TSQ_INFINITE_TIMEOUT, NULL);
}
   
return 0;   
  
}
















//////////////////////////////////////////////请大家指点下,找了几天了也不知道怎么回事,谢谢了
发表于 2009-11-3 08:35:39 | 显示全部楼层
CmtScheduleThreadPoolFunction (DEFAULT_THREAD_POOL_HANDLE,GetDataThreadFunction, NULL, FunctionID);
CmtScheduleThreadPoolFunctionAdv (DEFAULT_THREAD_POOL_HANDLE,GetDataThreadFunction,NULL,
THREAD_PRIORITY_HIGHEST , NULL, NULL, NULL, NULL,FunctionID) ;  
——有必要同时用这两条语句吗?
 楼主| 发表于 2009-11-3 12:23:03 | 显示全部楼层
2# netcreature
我不太会用,设定优先级别只能用那个后面的函数把?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|cpubbs论坛. ( 粤ICP备09171248号 )

GMT+8, 2025-4-20 17:35 , Processed in 0.745283 second(s), 6 queries , Gzip On, File On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表