|
Borland C++. Как запустить программу в несколько потоков., Borland C++. Как запустить программу в несколько потоков. |
|
|
|
Sep 24 2008, 22:09
|
Местный
  
Группа: Свой
Сообщений: 215
Регистрация: 10-04-07
Пользователь №: 26 929

|
Собственно вопрос в теме.
Есть проект типа WindowsForm, всякие кнопочки и прочая лабуда. Проблема в следующем, при нажатии на кнопку, управление к форме возвращается только после того, как завершится выполнение функции, привязаной к данной кнопке.
Так вот если кнопкой читать какой либо большой файл или общатся по COM порту, то прога на длительные времена просто "подвисает" и перестает реагировать. Самое простое что мне пришло на ум - это организовать чтение или обмен в другом потоке(tread). Но как это сделать я не представляю. Вообще в проекте типа формы это реально?
В данный момент все решено с помощью объекта TIMER с периодом 1мс. Процесс чтения разбивается на куски, и после каждых 2кб данных, ждем следующее переполнение. Метод конечно крайне кривой, и хотелось бы сделать как нормальные люди...
Вообщем, объясните, если не трудно что и как надо делать, или хоть направление куда идти.
PS: среда C++Bulder 6.
|
|
|
|
|
 |
Ответов
|
Sep 29 2008, 12:12
|
Местный
  
Группа: Свой
Сообщений: 215
Регистрация: 10-04-07
Пользователь №: 26 929

|
Angelo, спасибо за PDF-ку, очень доходчиво написано.
Возник такой вопрос: Я создаю объект TThread, и в Execute() ему помещаю то, что должно делатся в во втором потоке. Из этого Execute я могу посылать сообщения(Postmessage) основному окну и сообщать о текущем состоянии и пр.
Но из основного окна я не могу посылать сообщения дочернему потоку, так как объект TThread не является окном.
Что в этом случае делать? Просто объявить глобальную переменную bool FLAG, в основном потоке писать в нее, а в дочернем постоянно читать? Да, и как быть с ситуацией, когда запись FLAG прерывается на пол пути для переключения к другому процессу? Использовать эмбедерские свойства volatile, или организовывать Mutex для этого флага?
|
|
|
|
|
Sep 29 2008, 12:35
|
Местный
  
Группа: Свой
Сообщений: 381
Регистрация: 27-07-08
Из: теплые края
Пользователь №: 39 233

|
Цитата(Amper25 @ Sep 29 2008, 15:12)  Возник такой вопрос: ... Что в этом случае делать? Просто объявить глобальную переменную bool FLAG, в основном потоке писать в нее, а в дочернем постоянно читать? Типа того. Только лучше не глобальную, а внутри Вашего класса-потока. И обернуть доступ к ней фунциями, обеспечивающими атомарность доступа. Цитата Использовать эмбедерские свойства volatile, Не достаточно. Цитата или организовывать Mutex для этого флага? Да.
|
|
|
|
Сообщений в этой теме
Amper25 Borland C++. Как запустить программу в несколько потоков. Sep 24 2008, 22:09 SysRq RSDN.ru: Работа с потоками в C#
--
Эээээ... сто... Sep 24 2008, 22:43 DeadMoroz Еще, если по-простому без тредов, можно в длительн... Sep 24 2008, 22:59 o-henry Про потоки в билдере: смотри в хелпе класс TThrea... Sep 25 2008, 06:10 Amper25 Всем спасибо за ответы.
ЦитатаЕще, если по-просто... Sep 25 2008, 13:53 Syberian Цитата(Amper25 @ Sep 25 2008, 17:53) Всем... Sep 26 2008, 21:15 Amper25 Вот еще глюки поймал.
Почему то в билдере, при доб... Sep 25 2008, 15:04 Angelo Вот статья на русском для начала, потоки и синхро... Sep 25 2008, 16:27 MrYuran Цитата(Amper25 @ Sep 29 2008, 16:12) Но и... Sep 29 2008, 12:28 Amper25 BOOL PostMessage(
HWND hWnd, // handle of dest... Sep 29 2008, 12:35 XVR Цитата(Amper25 @ Sep 29 2008, 16:35) BOOL... Sep 30 2008, 07:49 Amper25 да и в самом определении PostMessage
HWND hWnd /... Sep 29 2008, 12:36 Asb Цитата(Amper25 @ Sep 29 2008, 16:12) Да, ... Sep 29 2008, 13:18 vik0 Цитата(Asb @ Sep 29 2008, 16:18) Можно ис... Sep 29 2008, 13:50
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|