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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> 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
SysRq
сообщение Sep 24 2008, 22:43
Сообщение #2


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



RSDN.ru: Работа с потоками в C# rolleyes.gif

--

Эээээ... стоп! Какой еще WindowsForm в BCB++ 6?! 07.gif Окрывайте Google, спрашивайте "потоки с++", читайте..

Сообщение отредактировал SysRq - Sep 24 2008, 22:44
Go to the top of the page
 
+Quote Post
DeadMoroz
сообщение Sep 24 2008, 22:59
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 3-02-05
Пользователь №: 2 391



Еще, если по-простому без тредов, можно в длительном цикле написать
Application->ProcessMessages()
тогда прога будет реагировать на другие события.
Go to the top of the page
 
+Quote Post
o-henry
сообщение Sep 25 2008, 06:10
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 435
Регистрация: 8-03-06
Из: степей Украины
Пользователь №: 15 069



Про потоки в билдере: смотри в хелпе класс TThread.
Go to the top of the page
 
+Quote Post
Amper25
сообщение Sep 25 2008, 13:53
Сообщение #5


Местный
***

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



Всем спасибо за ответы.

Цитата
Еще, если по-простому без тредов, можно в длительном цикле написать
Application->ProcessMessages()
тогда прога будет реагировать на другие события.


Отлично, прямо то что надо в данной ситуации. На все реагирует, только не хочет закрывать прогу почемуто.
Go to the top of the page
 
+Quote Post
Amper25
сообщение Sep 25 2008, 15:04
Сообщение #6


Местный
***

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



Вот еще глюки поймал.
Почему то в билдере, при добавлении(создании) класса TThread, из ClassExplorer исчезли созданные мною ранее классы. Причем они все равно используются и проект компилируется, но ClassExplorer их не видит.

Что это может быть такое?
Go to the top of the page
 
+Quote Post
Angelo
сообщение Sep 25 2008, 16:27
Сообщение #7


Участник
*

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



Вот статья на русском для начала, потоки и синхронизация процесов, а там дальше разберётесь я думаю... хелп от билдера посмотрите...
Прикрепленные файлы
Прикрепленный файл  rus5_Processes_and_Threads.pdf ( 464.11 килобайт ) Кол-во скачиваний: 916
 
Go to the top of the page
 
+Quote Post
Syberian
сообщение Sep 26 2008, 21:15
Сообщение #8


Участник
*

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



Цитата(Amper25 @ Sep 25 2008, 17:53) *
Всем спасибо за ответы.
Отлично, прямо то что надо в данной ситуации. На все реагирует, только не хочет закрывать прогу почемуто.


Чтобы оно закрыло прогу, надо выйти из процедуры. Terminate и проч. не катят. Единственный выход - вместе с ProcessMessages делать проверку глобальной переменной (типа if (CloseFlag) {Application->Terminate; return;}), а в эвенте формы OnClose устанавливать CloseFlag в 1
Go to the top of the page
 
+Quote Post
Amper25
сообщение Sep 29 2008, 12:12
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 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
MrYuran
сообщение Sep 29 2008, 12:28
Сообщение #10


Беспросветный оптимист
******

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



Цитата(Amper25 @ Sep 29 2008, 16:12) *
Но из основного окна я не могу посылать сообщения дочернему потоку, так как объект TThread не является окном.

Не совсем понятно, причём тут окно...
Если текстовые сообщения - имхо, очереди как раз для этого придумали.
Или что имеется в виду?


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Amper25
сообщение Sep 29 2008, 12:35
Сообщение #11


Местный
***

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



BOOL PostMessage(
HWND hWnd, // handle of destination window
UINT Msg, // message to post
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);


Проблема в этом:
HWND hWnd, // handle of destination window

Если я в качестве этого поставлю:
MY_Thread->Handle,
то компилятор ругается:

Error: Cannot convert "const unsigned int" to "void"

Потому что FORM->Handle - имеет тип void*
а TThread->Handle это просто константа типа unsigned int.

Из этого я сделал вывод, что сообщения можно посылать только окнам.
Go to the top of the page
 
+Quote Post
vik0
сообщение Sep 29 2008, 12:35
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 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
сообщение Sep 29 2008, 12:36
Сообщение #13


Местный
***

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



да и в самом определении PostMessage

HWND hWnd //handle of destination window

Тоесть только окнам.
Go to the top of the page
 
+Quote Post
Asb
сообщение Sep 29 2008, 13:18
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 294
Регистрация: 11-11-04
Из: Москва
Пользователь №: 1 109



Цитата(Amper25 @ Sep 29 2008, 16:12) *
Да, и как быть с ситуацией, когда запись FLAG прерывается на пол пути для переключения к другому процессу?

Можно использовать функции Win API Interlocked... По-моему в Help'e описание присутствует.
Go to the top of the page
 
+Quote Post
vik0
сообщение Sep 29 2008, 13:50
Сообщение #15


Местный
***

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



Цитата(Asb @ Sep 29 2008, 16:18) *
Можно использовать функции Win API Interlocked... По-моему в Help'e описание присутствует.

Можно. До тех пор пока sizeof(FLAG) <= 4
Go to the top of the page
 
+Quote Post

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

 


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


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