Как отправить строку через PostMessage?

Украдите тот из получислового knuth. Это высококачественно и просто реализовать. Это использует пару массивов, дополнения и нескольких IFS. Дешевый, эффективный, и хороший длительный период 2^55, если я вспоминаю правильно.

16
задан Blacktempel 12 January 2015 в 13:05
поделиться

3 ответа

Вы не можете передать адрес строки в PostMessage, так как строка, вероятно, является локальной для потока в стеке. К тому времени, когда другой поток подхватит его, он мог быть уничтожен.

Вместо этого вы должны создать новую строку или объект исключения через new и передать его адрес другому потоку (через параметр WPARAM или LPARAM в PostMessage. ) Другой поток затем владеет объектом и отвечает за его уничтожение.

Вот пример кода, который показывает, как это можно сделать:

try
{
    //do stuff
}
catch (MyException& the_exception)
{
    PostMessage(MyhWnd, CWM_SOME_ERROR, 0, new string(the_exception.error_string));
}


LPARAM CMyDlg::SomeError(WPARAM, LPARAM lParam)
{
    // Put in shared_ptr so it is automatically destroyed.
    shared_ptr<string> msg = reinterpret_cast<string*>(lParam);

    // Do stuff with message

    return 0;
}
13
ответ дан 30 November 2019 в 22:55
поделиться

Пока вы находитесь в процессе, достаточно просто передать указатель void * и немного позаботиться о времени жизни объекта.

Если это SendMessage, вы можете передать его в LPARAM как преобразование void * , и клиент вернет его к вашему строковому типу. Поскольку SendMessage синхронный , вы в безопасности:

Если указанное окно было создано вызывающий поток, окно процедура вызывается сразу как подпрограмма. Если указанное окно был создан другим потоком, система переключается на этот поток и вызывает соответствующее окно процедура. Сообщения, отправленные между потоки обрабатываются только тогда, когда получающий поток выполняет сообщение код поиска. Отправляющий поток заблокирован, пока получающий поток обрабатывает сообщение

. Если вы хотите использовать PostMessage, вам придется выполнить явную передачу, потому что вызов является асинхронным: сделайте копию строки в куче и, вызвав PostMessage, вы передали ответственность за удаление на calee (диалог).

Если вы выйдете из процесса (MyhWnd принадлежит другому процессу), тогда это совсем другая история, и вам придется упорядочить свое сообщение в нечто вроде глобального атома.

1
ответ дан 30 November 2019 в 22:55
поделиться

Если вы знаете, что ваше окно (или экземпляр CMyDlg ) будет по-прежнему работать после публикации сообщения, вы можете просто сохранить строку ошибки в переменной-члене и прочтите это в обработчике сообщений.

0
ответ дан 30 November 2019 в 22:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: