|
|
|
petlyura |
|
||||
Бывалый Профиль Группа: Участник Сообщений: 162 Регистрация: 30.1.2008 Где: Харьков Репутация: 2 Всего: 2 |
Привет форумчанам! Есть такая проблема.
Была прога, в ней создавалось несколько потоков, которые считывали данные с различных COM-портов. Потоки я не синхронизировал, т.к. VCL при этом не задействован. При этом для выполнения дальнейшего кода надо было подождать, пока все данные с COM-портов не будут считаны. Вот так вот:
Короче, все работало. А теперь пришлось добавить код, который выдает сообщение на экран и ожидает, пока пользователь не нажмет OK, чтобы записать время его нажатия. Пока пользователь тупит и смотрит на это сообщения (а их может быть и несколько), необходимо, чтобы дальше выполнялось чтение данных с COM-портов. Т.к. тут использовалось сообщение, то я закинул его в синхронный поток.
А теперь трабла: После завершения WaitClick, ну и, соответственно, TMessThread::Execute, следующий шаг (нажимаю F7), идет ComThread[i]->Free(); ComThread[i] = NULL; Как будто ComThread дождался WaitFor своего. При этом ComThread[i] уже ссылается на другую область памяти (другой адрес), а следующий ComThread[i] вообще равен NULL, и выбрасывает на ComThread[i]->WaitFor(); Access Violation at address ... Read of address. (что и понятно, ведь ComThread[i] = NULL). Почему после выполнения TMessThread::Execute происходит потеря памяти у ComThread, и что делать? Пробовал для MessThread, FreeOnTerminate = false; и WaitFor, но все равно трабла. |
||||
|
|||||
dumb |
|
|||
sceloglauxalbifacies Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 32 Всего: 158 |
такой код практически всегда является следствием недопонимания происходящего.
если ReadLbd работает с COM-портом, и к тому же уже сделана обертка для вызова этой функции из отдельных потоков, то оставлять один ее вызов в основном потоке как-то неразумно. в курсе, что есть такая клевая штука, как delete? а в общем, без полного кода тут довольно трудно что-то сказать наверняка, а полный код, судя по всему, довольно объемен и запутан, так что я на твоем месте рассчитывал бы в основном на свои силы. |
|||
|
||||
petlyura |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 162 Регистрация: 30.1.2008 Где: Харьков Репутация: 2 Всего: 2 |
Все ок! Синхронайз убрал, на всяк пожарный применил ф-цию
int MessageBox( HWND hWnd, // handle of owner window LPCTSTR lpText, // address of text in message box LPCTSTR lpCaption, // address of title of message box UINT uType // style of message box ); вместо VCL TApplication::MessageBox. Работает. Тьфу-тьфу-тьфу! Всем спасибо за участие! |
|||
|
||||
Правила форума "С++ Builder" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C++ Builder | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |