![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Dubinsky |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 252 Регистрация: 1.6.2005 Репутация: нет Всего: нет |
есть некая функция , при обращении к которой она должна ждать когда ей дадут команду и только после этого завершить своё выполнение, как это реализовать ?
это работает но цикл , жрёт проц на все 100 , как по-другому можно ждать ? |
|||
|
||||
| Orlan |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 142 Регистрация: 10.6.2004 Где: Киев Репутация: нет Всего: 1 |
Создать другой поток (thread) и в нем выполнять эту функцию. Внутри цикла опрашивать переменную uslovie, которая может поменяться в основном (пользовательском) потоке.
Это сообщение отредактировал(а) Orlan - 22.8.2005, 17:47 --------------------
А вы знали, что терапевт - это 1024 гигапевта или 1048576 мегапевтов |
|||
|
||||
| srd |
|
|||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
Если я правильно понял, что тебе надо, то читаем документацию на тему CreateThread/WaitForSingleObject/CreateEvent
-------------------- Не смей читать мою подпись!!! |
|||
|
||||
| Orlan |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 142 Регистрация: 10.6.2004 Где: Киев Репутация: нет Всего: 1 |
В С++ Builder-e кажется есть класс TThread, можно покопать еще в этом направлении.
Если используется в проекте стандартная библиотека С, то вместо CreateThread надо использовать _beginthread (Он есть в ВизуалСи, и по идее должен быть и в билдере) --------------------
А вы знали, что терапевт - это 1024 гигапевта или 1048576 мегапевтов |
|||
|
||||
| Dubinsky |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 252 Регистрация: 1.6.2005 Репутация: нет Всего: нет |
уффф думал обойтись ка то без потоков ... ну да ладно ... попробую ...
Добавлено @ 17:55 используется Билдер кстати ... |
|||
|
||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
А я могу предложить свою версию? Я не тестировал этот код, но вдруг получится...
Еще раз повторю, это мое предположение... Это сообщение отредактировал(а) sim7 - 22.8.2005, 17:59 |
|||
|
||||
| Orlan |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 142 Регистрация: 10.6.2004 Где: Киев Репутация: нет Всего: 1 |
Без потоков тоже можно, внутри цикла ты должен организовать обработку приходящих сообщений (messages). Только это можеть негативно сказатся на производительности цикла.
Ксати
жрёт проц на все 100 это значит работает, не простаивает Это сообщение отредактировал(а) Orlan - 22.8.2005, 18:03 --------------------
А вы знали, что терапевт - это 1024 гигапевта или 1048576 мегапевтов |
|||
|
||||
| Dubinsky |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 252 Регистрация: 1.6.2005 Репутация: нет Всего: нет |
цикл не делает ничего ! он ждёт , после чего по сигналу , по заранее известному адресу (событие типа : Ахой , пришли новые данные) считывает данные. жрёт потому что как проц свободен он сразу оп , и проверять что там у нас с переменной ...
как я понял мне следует : 1 создать семафор : HANDLE CreateSemaphore( LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,// NULL ? LONG lInitialCount, // initial count // 0 ? LONG lMaximumCount, // maximum count // 1 LPCTSTR lpName // pointer to semaphore-object name // WTF ???? это его имя ? ); 2 ждать его изменения . DWORD WaitForSingleObject( HANDLE hHandle, // handle of object to wait for - семафор хэндл ? DWORD dwMilliseconds // time-out interval in milliseconds ну тут всё ясно ); так получается ? Это сообщение отредактировал(а) Dubinsky - 22.8.2005, 18:07 |
|||
|
||||
| Orlan |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 142 Регистрация: 10.6.2004 Где: Киев Репутация: нет Всего: 1 |
Если сигнал подается другим потоком или процессом, то можно и так
Семафорами я не пользовался, не знаю Можно через события делать (CreateEvent) --------------------
А вы знали, что терапевт - это 1024 гигапевта или 1048576 мегапевтов |
|||
|
||||
| Dubinsky |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 252 Регистрация: 1.6.2005 Репутация: нет Всего: нет |
а разве процесс не связан с .ехе файлом , разве он не станет светится в Windows Task Managere ?
|
|||
|
||||
| Orlan |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 142 Регистрация: 10.6.2004 Где: Киев Репутация: нет Всего: 1 |
Я имел ввиду, что если тут участвует всего один поток, то например пользователь не сможет нажать кнопку, после которой начнутся выдаватся новые данные. Если же источник событий не пользователь, а другой поток или процесс, то таких проблем не будет.
ликбез: экзешник - это просто файл на диске, а процесс - это запущенный экзешник, потоки - это то, что выполняется на процессоре, процесс состоит из потоков и глобальных данных. --------------------
А вы знали, что терапевт - это 1024 гигапевта или 1048576 мегапевтов |
|||
|
||||
| Dubinsky |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 252 Регистрация: 1.6.2005 Репутация: нет Всего: нет |
у меня в принципе не нужно чтоб юзер жал там что-то , просто он нажимает ОК , посылается инфа на сервер ,ждётся ответ (waitForSingleObject), обратно получается инфа , срабатывает событие onClientRead() (вот тут то самое интересное , сработает ли ? если уже ждётся ? waitForSingleObject'ом ) , и идём дальше ...
ладно до завтра ... надеюсь проверю я эти семафоры ... |
|||
|
||||
| Orlan |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 142 Регистрация: 10.6.2004 Где: Киев Репутация: нет Всего: 1 |
По сложности это одно и то же, это некая реакция пользователя.
Если использутся сокеты, то лучше использовать WSA функции, WSASelect или их аналог от Борланда (если есть). Уведомление о пришедших данных с сервера поступят в оконную процедуру обработку сообщений и можно будет реализовать без потоков и без функций работы с событиями, семафорами и прочими функциями синхронизации. --------------------
А вы знали, что терапевт - это 1024 гигапевта или 1048576 мегапевтов |
||||
|
|||||
| Dubinsky |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 252 Регистрация: 1.6.2005 Репутация: нет Всего: нет |
да я решил проще :
вот вопрос всё как бы неплохо даже получилось , но мучает вопрос а как сделать подобие ShowModal() ?Чтоб переменную поменял и хоп , всё пошло дальше , а когда вызываем ShowModal() прога работает а не спит как WaitSingleObject() ? |
|||
|
||||
| Orlan |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 142 Регистрация: 10.6.2004 Где: Киев Репутация: нет Всего: 1 |
Это обычное использование модальных окон, странно что вообще тогда возникили вопросы.
Надо принудительно закрывать форму WaitFrm из другого потока или из обработкичка сообщений этой формы. --------------------
А вы знали, что терапевт - это 1024 гигапевта или 1048576 мегапевтов |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |