| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > Асинхронные и синхронные потоки |
| Автор: petlyura 21.11.2008, 13:57 | ||||
| Привет форумчанам! Есть такая проблема. Была прога, в ней создавалось несколько потоков, которые считывали данные с различных 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 22.11.2008, 04:59 |
| такой код практически всегда является следствием недопонимания происходящего. если ReadLbd работает с COM-портом, и к тому же уже сделана обертка для вызова этой функции из отдельных потоков, то оставлять один ее вызов в основном потоке как-то неразумно. в курсе, что есть такая клевая штука, как delete? а в общем, без полного кода тут довольно трудно что-то сказать наверняка, а полный код, судя по всему, довольно объемен и запутан, так что я на твоем месте рассчитывал бы в основном на свои силы. |
| Автор: petlyura 22.11.2008, 12:22 |
| Все ок! Синхронайз убрал, на всяк пожарный применил ф-цию 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. Работает. Тьфу-тьфу-тьфу! Всем спасибо за участие! |