WinCE 多线程 更新UI时出现Data Abort 求解

iknowle 2013-04-24 03:49:55
在WinCE平台下用Qt写的Demo. 注册某Api回调,然后在回调中emit signal,在slot中操作UI-更新Label, button的Enable/Disable, 更新QTreeWigdet,但是程序会Crash, Data Abort 在QtGui4.dll 和QtCore4.dll 有没有遇到过这种问题的朋友,求教一下。或者知道怎么调试吗?给点思路也行,刚刚看Qt不久。

贴部分代码:

回调
static void onWfdStateChange(WDK_WFD_STATE state, DWORD dwSubstate, HRESULT hr);
static void onDeviceDiscovery(DWORD cDevices);

Emit signal
void sendSignalUpdateDevice(DWORD cDevices) { emit signalUpdateDevice(cDevices); }
void sendSignalWfdState(WDK_WFD_STATE state, DWORD dwSubstate){ emit signalWfdState(state, dwSubstate);

Connect
connect(Proxy::singleton(), SIGNAL(signalUpdateDevice(DWORD)), this, SLOT(notifyUpdateDevice(DWORD)), Qt::QueuedConnection);
connect(Proxy::singleton(), SIGNAL(signalWfdState(WDK_WFD_STATE, DWORD)), this, SLOT(notifyWfdState(WDK_WFD_STATE, DWORD)), Qt::QueuedConnection);

Slot
1 UpdateDevice
{
...调用Api 获取Device 信息
QName = QString::fromUtf16(pDevices[i].devInfo.wzName);
qStringList = QStringList() << qName << qMac << qRssi << qType;

...更新treeWidget
QTreeWidgetItem *lpqItem = new QTreeWidgetItem(qStringList);
lpqItem->setData(0, Qt::UserRole, QVariant(qName));
ui.treeWidget_devices->addTopLevelItem(lpqItem);
}

2. StateChange
{
..根据 State 设置label的 text 和 Button的enable/disable
}

由于回调必须是Static, 采用了Proxy 参考这篇文章
http://chloerei.com/2010/04/11/warp-a-callback-base-c-library-with-qt-signal-slot-mechanism/

程序不是每次都crash,但概率还是很大.
...全文
133 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
rickys2080 2013-04-29
  • 打赏
  • 举报
回复
看map文件
一介布衣萧萧 2013-04-28
  • 打赏
  • 举报
回复
贴错误信息出来

21,489

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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