реклама на сайте
подробности

 
 
> Borland C++. Как запустить программу в несколько потоков., Borland C++. Как запустить программу в несколько потоков.
Amper25
сообщение Sep 24 2008, 22:09
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 215
Регистрация: 10-04-07
Пользователь №: 26 929



Собственно вопрос в теме.

Есть проект типа WindowsForm, всякие кнопочки и прочая лабуда. Проблема в следующем, при нажатии на кнопку, управление к форме возвращается только после того, как завершится выполнение функции, привязаной к данной кнопке.

Так вот если кнопкой читать какой либо большой файл или общатся по COM порту, то прога на длительные времена просто "подвисает" и перестает реагировать.
Самое простое что мне пришло на ум - это организовать чтение или обмен в другом потоке(tread). Но как это сделать я не представляю. Вообще в проекте типа формы это реально?

В данный момент все решено с помощью объекта TIMER с периодом 1мс. Процесс чтения разбивается на куски, и после каждых 2кб данных, ждем следующее переполнение. Метод конечно крайне кривой, и хотелось бы сделать как нормальные люди...

Вообщем, объясните, если не трудно что и как надо делать, или хоть направление куда идти.

PS: среда C++Bulder 6.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Amper25
сообщение Sep 29 2008, 12:12
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 215
Регистрация: 10-04-07
Пользователь №: 26 929



Angelo, спасибо за PDF-ку, очень доходчиво написано.

Возник такой вопрос:
Я создаю объект TThread, и в Execute() ему помещаю то, что должно делатся в во втором потоке.
Из этого Execute я могу посылать сообщения(Postmessage) основному окну и сообщать о текущем состоянии и пр.

Но из основного окна я не могу посылать сообщения дочернему потоку, так как объект TThread не является окном.

Что в этом случае делать? Просто объявить глобальную переменную
bool FLAG, в основном потоке писать в нее, а в дочернем постоянно читать?
Да, и как быть с ситуацией, когда запись FLAG прерывается на пол пути для переключения к другому процессу?
Использовать эмбедерские свойства volatile, или организовывать Mutex для этого флага?
Go to the top of the page
 
+Quote Post
vik0
сообщение Sep 29 2008, 12:35
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 27-07-08
Из: теплые края
Пользователь №: 39 233



Цитата(Amper25 @ Sep 29 2008, 15:12) *
Возник такой вопрос:
...
Что в этом случае делать? Просто объявить глобальную переменную
bool FLAG, в основном потоке писать в нее, а в дочернем постоянно читать?

Типа того. Только лучше не глобальную, а внутри Вашего класса-потока. И обернуть доступ к ней фунциями, обеспечивающими атомарность доступа.
Цитата
Использовать эмбедерские свойства volatile,

Не достаточно.
Цитата
или организовывать Mutex для этого флага?

Да.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 13th August 2025 - 04:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.01381 секунд с 7
ELECTRONIX ©2004-2016