Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> функция должна ждать команды а как ? 
:(
    Опции темы
Dubinsky
Дата 22.8.2005, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 1.6.2005

Репутация: нет
Всего: нет



есть некая функция , при обращении к которой она должна ждать когда ей дадут команду и только после этого завершить своё выполнение, как это реализовать ?
Код

void mywaitfunc(void)
{
   uslovie = false;
   while(true)
   {
      if (uslovie) break;
   }
}
//==============
//где то на другом краю кода (для примера на самом деле ждать условие надо будет н
//не от визуальных компонентов а из нета но смысл то один и тотже)
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  uslovie = true;
}


это работает но цикл , жрёт проц на все 100 , как по-другому можно ждать ?

PM MAIL WWW   Вверх
Orlan
Дата 22.8.2005, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 10.6.2004
Где: Киев

Репутация: нет
Всего: 1



Создать другой поток (thread) и в нем выполнять эту функцию. Внутри цикла опрашивать переменную uslovie, которая может поменяться в основном (пользовательском) потоке.

Это сообщение отредактировал(а) Orlan - 22.8.2005, 17:47
--------------------
А вы знали, что терапевт - это 1024 гигапевта или 1048576 мегапевтов
PM MAIL   Вверх
srd
Дата 22.8.2005, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



Если я правильно понял, что тебе надо, то читаем документацию на тему CreateThread/WaitForSingleObject/CreateEvent


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Orlan
Дата 22.8.2005, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 10.6.2004
Где: Киев

Репутация: нет
Всего: 1



В С++ Builder-e кажется есть класс TThread, можно покопать еще в этом направлении.
Если используется в проекте стандартная библиотека С, то вместо CreateThread надо использовать _beginthread (Он есть в ВизуалСи, и по идее должен быть и в билдере)
--------------------
А вы знали, что терапевт - это 1024 гигапевта или 1048576 мегапевтов
PM MAIL   Вверх
Dubinsky
Дата 22.8.2005, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 1.6.2005

Репутация: нет
Всего: нет



уффф думал обойтись ка то без потоков ... ну да ладно ... попробую ...
Добавлено @ 17:55
используется Билдер кстати ...
PM MAIL WWW   Вверх
mr.Anderson
Дата 22.8.2005, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



А я могу предложить свою версию? Я не тестировал этот код, но вдруг получится...
Код

#include <windows.h>

int sleep=0;

void YOUR_WAIT_FUNC(void)
{
//Что-то там делаем
//...
//Когда надо ждать, пишем
do Sleep(1) while(!sleep);
}
//На другом конце провода (то есть программы :))
...
//Если что-то происходит, то
sleep=1;

Еще раз повторю, это мое предположение...

Это сообщение отредактировал(а) sim7 - 22.8.2005, 17:59


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Orlan
Дата 22.8.2005, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 10.6.2004
Где: Киев

Репутация: нет
Всего: 1



Без потоков тоже можно, внутри цикла ты должен организовать обработку приходящих сообщений (messages). Только это можеть негативно сказатся на производительности цикла.
Ксати
Цитата
... но цикл , жрёт проц на все 100 ...

жрёт проц на все 100 это значит работает, не простаивает smile

Это сообщение отредактировал(а) Orlan - 22.8.2005, 18:03
--------------------
А вы знали, что терапевт - это 1024 гигапевта или 1048576 мегапевтов
PM MAIL   Вверх
Dubinsky
Дата 22.8.2005, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM MAIL WWW   Вверх
Orlan
Дата 22.8.2005, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 10.6.2004
Где: Киев

Репутация: нет
Всего: 1



Если сигнал подается другим потоком или процессом, то можно и так
Семафорами я не пользовался, не знаю
Можно через события делать (CreateEvent)
--------------------
А вы знали, что терапевт - это 1024 гигапевта или 1048576 мегапевтов
PM MAIL   Вверх
Dubinsky
Дата 22.8.2005, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 1.6.2005

Репутация: нет
Всего: нет



а разве процесс не связан с .ехе файлом , разве он не станет светится в Windows Task Managere ?
PM MAIL WWW   Вверх
Orlan
Дата 22.8.2005, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 10.6.2004
Где: Киев

Репутация: нет
Всего: 1



Я имел ввиду, что если тут участвует всего один поток, то например пользователь не сможет нажать кнопку, после которой начнутся выдаватся новые данные. Если же источник событий не пользователь, а другой поток или процесс, то таких проблем не будет.
ликбез:
экзешник - это просто файл на диске, а процесс - это запущенный экзешник, потоки - это то, что выполняется на процессоре, процесс состоит из потоков и глобальных данных.
--------------------
А вы знали, что терапевт - это 1024 гигапевта или 1048576 мегапевтов
PM MAIL   Вверх
Dubinsky
Дата 22.8.2005, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 1.6.2005

Репутация: нет
Всего: нет



у меня в принципе не нужно чтоб юзер жал там что-то , просто он нажимает ОК , посылается инфа на сервер ,ждётся ответ (waitForSingleObject), обратно получается инфа , срабатывает событие onClientRead() (вот тут то самое интересное , сработает ли ? если уже ждётся ? waitForSingleObject'ом ) , и идём дальше ...

ладно до завтра ... надеюсь проверю я эти семафоры ...
PM MAIL WWW   Вверх
Orlan
Дата 23.8.2005, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 10.6.2004
Где: Киев

Репутация: нет
Всего: 1



Цитата(Dubinsky @ 22.8.2005, 18:51)
у меня в принципе не нужно чтоб юзер жал там что-то , просто он нажимает ОК,

По сложности это одно и то же, это некая реакция пользователя.
Цитата(Dubinsky @ 22.8.2005, 18:51)

посылается инфа на сервер ,ждётся ответ (waitForSingleObject), обратно получается инфа , срабатывает событие onClientRead() (вот тут то самое интересное , сработает ли ? если уже ждётся ? waitForSingleObject'ом ) , и идём дальше ...

Если использутся сокеты, то лучше использовать WSA функции, WSASelect или их аналог от Борланда (если есть). Уведомление о пришедших данных с сервера поступят в оконную процедуру обработку сообщений и можно будет реализовать без потоков и без функций работы с событиями, семафорами и прочими функциями синхронизации.
--------------------
А вы знали, что терапевт - это 1024 гигапевта или 1048576 мегапевтов
PM MAIL   Вверх
Dubinsky
Дата 23.8.2005, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 1.6.2005

Репутация: нет
Всего: нет



да я решил проще :

Код

// user nazhal knopku
if (WaitFrm->ShowModal() ==mrOk) // pokazivaem formu tipa "zhdite otveta.." zakrit' ee neljzja
{
    // vse ok rabotaem
}else
{
   // fak oshibka
}
///////////////////////////////////////////////////////////////////////////////////////////////////////
// gde to na drugom konce koda
{
   //gde to v obrabotchike soobschenij
...
   WaitFrm->ModalResult = mrOk;
}


вот вопрос всё как бы неплохо даже получилось , но мучает вопрос а как сделать подобие ShowModal() ?Чтоб переменную поменял и хоп , всё пошло дальше , а когда вызываем ShowModal() прога работает а не спит как WaitSingleObject() ?

PM MAIL WWW   Вверх
Orlan
Дата 23.8.2005, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 10.6.2004
Где: Киев

Репутация: нет
Всего: 1



Цитата(Dubinsky @ 23.8.2005, 11:04)
да я решил проще ...

Это обычное использование модальных окон, странно что вообще тогда возникили вопросы.
Цитата(Dubinsky @ 23.8.2005, 11:04)
вот вопрос всё как бы неплохо даже получилось , но мучает вопрос а как сделать подобие ShowModal() ?Чтоб переменную поменял и хоп , всё пошло дальше , а когда вызываем ShowModal() прога работает а не спит как WaitSingleObject() ?

Надо принудительно закрывать форму WaitFrm из другого потока или из обработкичка сообщений этой формы.
--------------------
А вы знали, что терапевт - это 1024 гигапевта или 1048576 мегапевтов
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0670 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.