Украдите тот из получислового knuth. Это высококачественно и просто реализовать. Это использует пару массивов, дополнения и нескольких IFS. Дешевый, эффективный, и хороший длительный период 2^55, если я вспоминаю правильно.
Вы не можете передать адрес строки в 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;
}
Пока вы находитесь в процессе, достаточно просто передать указатель void * и немного позаботиться о времени жизни объекта.
Если это SendMessage, вы можете передать его в LPARAM как преобразование void * , и клиент вернет его к вашему строковому типу. Поскольку SendMessage синхронный , вы в безопасности:
Если указанное окно было создано вызывающий поток, окно процедура вызывается сразу как подпрограмма. Если указанное окно был создан другим потоком, система переключается на этот поток и вызывает соответствующее окно процедура. Сообщения, отправленные между потоки обрабатываются только тогда, когда получающий поток выполняет сообщение код поиска. Отправляющий поток заблокирован, пока получающий поток обрабатывает сообщение
. Если вы хотите использовать PostMessage, вам придется выполнить явную передачу, потому что вызов является асинхронным: сделайте копию строки в куче и, вызвав PostMessage, вы передали ответственность за удаление на calee (диалог).
Если вы выйдете из процесса (MyhWnd принадлежит другому процессу), тогда это совсем другая история, и вам придется упорядочить свое сообщение в нечто вроде глобального атома.
Если вы знаете, что ваше окно (или экземпляр CMyDlg
) будет по-прежнему работать после публикации сообщения, вы можете просто сохранить строку ошибки в переменной-члене и прочтите это в обработчике сообщений.