我正在尝试构建一个(具有Clr风格)的dll,以用盘中股票报价来馈送Windows应用程序。 dll由股票应用加载,然后其导出功能之一将启动下载器/生产器以获取数据。在第二步中,一旦dll接收到数据,更新程序/消费者将通过SendMessage通知股票应用程序。
我已经通过多种方式测试了下载部分是否按预期工作(有或没有线程支持),因此获取数据没有问题。在单次迭代的情况下(下面的test1),在快照引用可用之后,updater成功执行其任务,并且Windows UI得到更新。现在,为了获得新的报价,我将下载器和更新器函数调用放入循环内(下面的test2)。这次,下载程序连续工作,但更新程序中的SendMessage挂在那里,使Windows UI一直未更新,直到脱离循环为止。
这是测试代码和更新程序代码(我们知道它正在起作用,让我们放下下载机):
// test1: single iteration, sequential, simple insert only
// result: will update the stock app after quote download
void test1(HWND hwnd, UINT Msg)
{
producer->DownloadStocks();
prepareData(hwnd, Msg, 100);
}
// test2: one iteration of insert followed by updates upon quote download
// result: will update the stock app ONLY after it is out of the while loop
// update in test1 is blocked, too.
void test2(HWND hwnd, UINT Msg)
{
test1(hwnd, Msg);
int i = 0;
while (i<10)
{
producer->DownloadStocks();
prepareData(hwnd, Msg, 100);
i++;
}
}
void prepareData(HWND hwnd, UINT Msg, int timeout)
{
DateTime origin = DateTime(1970, 1, 1, 0, 0, 0, 0);
RCV_DATA rcv_data;
float vv = 0;
rcv_data.m_bDISK = FALSE;
rcv_data.m_nPacketNum = 1;
rcv_data.m_wDataType = RCV_REPORT;
RCV_REPORT_STRUCTEx data;
data.m_fBuyPrice[1] = 0;
data.m_fBuyVolume[1] = 0;
......
data.m_wMarket = (WORD)NQ_MARKET_EX;
while (consumer->received_data())
{
Console::WriteLine("*********************************");
while (consumer->NextRow())
{
sprintf(data.m_szLabel, "%s", consumer->GetValue("symbol"));
.......
data.m_fSellPrice[0] = getVal("ask");
data.m_fSellVolume[0] = getVal("asksize");
rcv_data.m_pReport = &data;
printf("\nsending update for %s", data.m_szLabel);
SendMessage(hwnd, Msg, (WPARAM)RCV_REPORT, (LPARAM)&rcv_data);
}
}
}
我知道SendMessage处于同步模式。是被某些东西阻止还是消息处理太慢?我该怎么办才能解决此问题?我应该同时考虑下载器和更新器的线程化吗?任何帮助,将不胜感激。
最佳答案
由于您已经通过SendMessage
将数据发送到UI线程,因此也可以将WM_PAINT
事件发送到该窗口。您可以使用UpdateWindow或InvalidateRect进行此操作。这将导致视图在更新后刷新。
跨线程重绘事件在此处用一些代码说明:redraw-from-another-thread
您需要始终保持UI线程空闲以便用户交互。
因此,请在后台线程中进行阻止工作(例如下载)。如果可以使用c++11
,则std::thread可以跨平台工作。
关于c - SendMessage不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29738821/