线程中调用全局函数失败,为什么?

qqxia 2003-08-12 10:12:55
有一个全局函数是取数据的。本来是使用定时器操作的,现在改为使用线程,但是改为线程以后调用全局函数就失败了。无法取到数据。
...全文
53 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
qqxia 2003-08-12
  • 打赏
  • 举报
回复
在定时器中调用这个函数是正确的
现在是DdeCreateStringHandle建立的对话句柄是空的,即使将这些句柄提前建立,保存在数组中,再调用DdeClientTransaction函数也不能正确执行!!!
qqxia 2003-08-12
  • 打赏
  • 举报
回复
原来是在定时器中使用DdeClientTransaction函数取得数据;
在取数据之前使用DdeCreateStringHandle建立对话句柄。函数体如下:
HSZ tagHsz;
if(lpItem[nIndex] !=NULL)
{
CString strShow = lpItem[nIndex];
MessageBox(NULL,strShow,"Msg",MB_OK);
}
if(dwDdeInst == NULL)
MessageBox(NULL,"dwDdeInst is NULL!","Msg",MB_OK);

tagHsz = DdeCreateStringHandle(dwDdeInst,
lpItem[nIndex], CP_WINANSI);

if(tagHsz == NULL)
MessageBox(NULL,"tagHsz is NULL!","Msg",MB_OK);

HDDEDATA getfromsrv;
if(ItemHSZ[nIndex] == NULL)
MessageBox(NULL,"DdeClientRequest Running!","Msg",MB_OK);
getfromsrv=DdeClientTransaction(NULL,0L,hRunConv,ItemHSZ[nIndex],CF_TEXT,
XTYP_REQUEST,2000,NULL);

if(getfromsrv != NULL)
{
MessageBox(NULL,"DdeClientRequest Running!","Msg",MB_OK);
LPBYTE recvclt;
recvclt=new BYTE[40];
DdeGetData(getfromsrv, recvclt, DdeGetData(getfromsrv, NULL, 0, 0), 0);
strcpy(cDataFromSrv,(LPSTR)recvclt);
delete recvclt;
DdeFreeStringHandle(dwDdeInst,tagHsz);
DdeFreeDataHandle(getfromsrv);
return TRUE;
}
else
return TRUE;
tigerfox 2003-08-12
  • 打赏
  • 举报
回复
你是怎么做的,具体说说?
qqxia 2003-08-12
  • 打赏
  • 举报
回复
DDE中的操作,烦阿
在线程中调用DDE的全局函数就会失败!!!
fantiyu 2003-08-12
  • 打赏
  • 举报
回复
不明白你的失败代表什么

是不是没加保护?

critical_section加了吗?
蟑螂工作室 2003-08-12
  • 打赏
  • 举报
回复
不太懂你的意思?
是不是你没有声明呀?
gzshd 2003-08-12
  • 打赏
  • 举报
回复
全局函数或变量在线程中的前面要加volatile,如
volatile int a;
volatile int a(){
...
}
qqxia 2003-08-12
  • 打赏
  • 举报
回复
没有人明白吗?
qqxia 2003-08-12
  • 打赏
  • 举报
回复
现在懂DDE的人很少了!
有谁做过多线程DDE数据采集程序的朋友,可以给我发一个多线程的DDE数据采集程序源代码!?
qqxia7885@sina.com
微软的专家呢?都到什么地方去了?

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧