gpt4 book ai didi

c - 发送消息不起作用

转载 作者:行者123 更新时间:2023-11-30 17:16:11 24 4
gpt4 key购买 nike

我正在尝试构建一个 dll(Clr 风格)来为 Windows 应用程序提供日内股票报价。该 dll 由 Stock 应用程序加载,然后其导出函数之一将启动下载器/生成器来获取数据。第二步,一旦 dll 收到数据,更新者/消费者将通过 SendMessage 通知库存应用程序。

我已经通过多种方式测试了下载部分是否按预期工作(有或没有线程支持),因此获取数据没有问题。在单次迭代情况下(下面的测试 1),在快照报价可用后,更新程序成功完成其任务并且 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 。这将导致 View 在更新后刷新。

这里用一些代码解释了跨线程重绘事件:redraw-from-another-thread

您需要保持 UI 线程始终空闲以供用户交互。因此,请在后台线程中执行阻塞工作(例如下载)。 std::thread如果您可以使用c++11,则可以跨平台工作。

关于c - 发送消息不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29738821/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com