SendMessage不起作用

时间:2015-04-20 03:21:27

标签: c dll sendmessage

我正在尝试构建一个dll(以Clr风格)来为Windows应用程序提供日内股票报价。 dll由stock app加载,然后其导出的一个函数将启动下载器/生成器来获取数据。在第二步中,一旦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处于同步模式。它是被某些东西阻止还是消息处理太慢了?我该怎么做才能解决这个问题?我应该考虑下载器和更新器的线程吗?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

'while'循环和该循环中的被调用函数正在占用CPU。

建议在while循环的每次迭代中自愿释放CPU。

也许通过调用nsleep()

答案 1 :(得分:0)

由于您已经通过SendMessage将数据发送到UI线程,因此您也可以将WM_PAINT事件发送到该窗口。您可以使用UpdateWindowInvalidateRect执行此操作。这会导致视图在更新后刷新。

此处解释了交叉线程重绘事件,其中包含一些代码:redraw-from-another-thread

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