WinCE 多线程 更新UI时出现Data Abort 求解
在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,但概率还是很大.