|
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 25 2008, 13:53
|
Местный
  
Группа: Свой
Сообщений: 215
Регистрация: 10-04-07
Пользователь №: 26 929

|
Всем спасибо за ответы. Цитата Еще, если по-простому без тредов, можно в длительном цикле написать Application->ProcessMessages() тогда прога будет реагировать на другие события. Отлично, прямо то что надо в данной ситуации. На все реагирует, только не хочет закрывать прогу почемуто.
|
|
|
|
|
Sep 25 2008, 16:27
|
Участник

Группа: Участник
Сообщений: 58
Регистрация: 1-12-07
Пользователь №: 32 871

|
Вот статья на русском для начала, потоки и синхронизация процесов, а там дальше разберётесь я думаю... хелп от билдера посмотрите...
|
|
|
|
|
Sep 26 2008, 21:15
|
Участник

Группа: Свой
Сообщений: 68
Регистрация: 29-12-06
Из: Омск
Пользователь №: 23 999

|
Цитата(Amper25 @ Sep 25 2008, 17:53)  Всем спасибо за ответы. Отлично, прямо то что надо в данной ситуации. На все реагирует, только не хочет закрывать прогу почемуто. Чтобы оно закрыло прогу, надо выйти из процедуры. Terminate и проч. не катят. Единственный выход - вместе с ProcessMessages делать проверку глобальной переменной (типа if (CloseFlag) {Application->Terminate; return;}), а в эвенте формы OnClose устанавливать CloseFlag в 1
|
|
|
|
|
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:28
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(Amper25 @ Sep 29 2008, 16:12)  Но из основного окна я не могу посылать сообщения дочернему потоку, так как объект TThread не является окном. Не совсем понятно, причём тут окно... Если текстовые сообщения - имхо, очереди как раз для этого придумали. Или что имеется в виду?
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Sep 29 2008, 12:35
|
Местный
  
Группа: Свой
Сообщений: 381
Регистрация: 27-07-08
Из: теплые края
Пользователь №: 39 233

|
Цитата(Amper25 @ Sep 29 2008, 15:12)  Возник такой вопрос: ... Что в этом случае делать? Просто объявить глобальную переменную bool FLAG, в основном потоке писать в нее, а в дочернем постоянно читать? Типа того. Только лучше не глобальную, а внутри Вашего класса-потока. И обернуть доступ к ней фунциями, обеспечивающими атомарность доступа. Цитата Использовать эмбедерские свойства volatile, Не достаточно. Цитата или организовывать Mutex для этого флага? Да.
|
|
|
|
|
Sep 29 2008, 13:18
|
Местный
  
Группа: Свой
Сообщений: 294
Регистрация: 11-11-04
Из: Москва
Пользователь №: 1 109

|
Цитата(Amper25 @ Sep 29 2008, 16:12)  Да, и как быть с ситуацией, когда запись FLAG прерывается на пол пути для переключения к другому процессу? Можно использовать функции Win API Interlocked... По-моему в Help'e описание присутствует.
|
|
|
|
|
Sep 29 2008, 13:50
|
Местный
  
Группа: Свой
Сообщений: 381
Регистрация: 27-07-08
Из: теплые края
Пользователь №: 39 233

|
Цитата(Asb @ Sep 29 2008, 16:18)  Можно использовать функции Win API Interlocked... По-моему в Help'e описание присутствует. Можно. До тех пор пока sizeof(FLAG) <= 4
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|