Поиск:

Ответ в темуСоздание новой темы Создание опроса
> бесконечные циклы, и оконное приложение 
:(
    Опции темы
En_t_end
Дата 5.12.2004, 05:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Давно мучил вопрос, а вот как правильно реализовать for( ; ; ) или допустим while(не получим WM_Завершение приложения) в программе, на основе окна, + почему-то постоянно идёт загрузка проца на 100 %, как это исправить ?
Добавлено @ 05:44
Может применять класс для нового окна, а там вставить этот цикл, а само окно не показывать, тогда будет казаться, что это приложение занимется циклом, но загрузка проца всё равно на 100%... ?????????????????
PM MAIL ICQ Skype GTalk Jabber   Вверх
maxim1000
Дата 5.12.2004, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



бесконечный цикл означает, что нужно сделать много работы
а если есть много работы, то почему бы и не загрузить процессор по полной smile
от оконности приложения это не зависит: бесконечный цикл в консольном приложении даст такой же результат
тут надо немного поточнее определиться, что на самом деле нужно
(если, например, идет ожидание чего-то, то можно воспользоваться каким-нибудь методом синхронизации, например, таймером)


--------------------
qqq
PM WWW   Вверх
En_t_end
Дата 5.12.2004, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



"тут надо немного поточнее определиться, что на самом деле нужно"

"идет ожидание чего-то"
вот именно это, но помоему в консольной реализациии при for(; ; ) такого не было...

"то можно воспользоваться каким-нибудь методом синхронизации, например, таймером"
А как? в смысле действующий пример не подкините?
Добавлено @ 11:31
Может проблема в том, что я использую цикл перед обработчиком сообщений?
PM MAIL ICQ Skype GTalk Jabber   Вверх
Mad
Дата 5.12.2004, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

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



Цитата(En_t_end @ 5.12.2004, 10:29)
Может проблема в том, что я использую цикл перед обработчиком сообщений?

общий вид (без синхранизации, обычно применяется в играх smile )

Код

MSG msg;
PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
while(msg.message != WM_QUIT)
{
   if (PeekMessage(&msg, 0, 0, PM_REMOVE))
   {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
   }

   // твой код
}




--------------------
user posted image
PM MAIL   Вверх
maxim1000
Дата 5.12.2004, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата
"идет ожидание чего-то"
вот именно это

реализация зависит как раз от "этого"
дело в том, что в Windows можно ожидать практически чего угодно (таймеры, ввод/вывод, завершение потоков или процессов, семафоры и много чего еще)
так что вариант с таймером может оказаться далеко не лучшим
я бы посоветовал почитать MSDN--Platform SDK--Base Services--DLLs, Processes and Threads--Synchronization (там, кстати, есть и примеры для многих вариантов синхронизации)
P.S.
а вообще, я бы не советовал выполнять очень много вычислений в потоке окна: это может сильно испортить интерфейс (кнопочки перестанут нажиматься, окно не будет перерисовываться, пользователь запаникует smile)
лучше запустить еще один поток и обмениваться с ним время от времени информацией...


--------------------
qqq
PM WWW   Вверх
En_t_end
Дата 6.12.2004, 06:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



"лучше запустить еще один поток и обмениваться с ним время от времени информацией..."
Во как раз то что мне нужно, а ссылку не дашь, или сам пример не приведёшь?
Мне надо допустим, чтобы тот поток с циклом выполн. след. :
цикл -> поток
поток -> осн. прогр.
цикл -> отловлено событие.
поток -> сообщение WM_%%% -> осн. прогр.
PM MAIL ICQ Skype GTalk Jabber   Вверх
maxim1000
Дата 6.12.2004, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата
цикл -> поток
поток -> осн. прогр.
цикл -> отловлено событие.
поток -> сообщение WM_%%% -> осн. прогр.

а вот этого и не понял smile
я вот тут подумал: может, просто сделать еще одно окно (и не показывать его) и общаться с помощью SendMessage
Цитата
"лучше запустить еще один поток и обмениваться с ним время от времени информацией..."
Во как раз то что мне нужно, а ссылку не дашь, или сам пример не приведёшь?

ссылка все та же: MSDN, там много об этом написано
что касается примера, может, такое подойдет:
1. функция потока:
Код
void ThreadFunction()
{
 while(true)
 {
   char x;
   DWORD num;
   //wait for a command to continue the loop
   ReadFile(ReadPipe,&x,1,&num,0);
   //do something
   MessageBox(...);
 }
}

2. при создании окна:
Код
{
 DWORD tid;
 CreatePipe(&ReadPipe,&WritePipe,0,128);
 CreateThread(0,0,(LPTHREAD_START_ROUTINE)ThreadFunction,0,0,&tid);
}

3. при получении сообщения
Код
{
 DWORD num;
 WriteFile(WritePipe,"q",1,&num,0);
}


при этом должны быть объявлены две глобальные переменные:
HANDLE WritePipe,ReadPipe;

только код я не проверял (т.к. это только куски)

конечно, для подобных вещей лучше использовать Event, но я с ним не работал, так что на вскидку код не напишу...



--------------------
qqq
PM WWW   Вверх
Mad
Дата 6.12.2004, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

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



Цитата(maxim1000 @ 6.12.2004, 10:52)
я вот тут подумал: может, просто сделать еще одно окно (и не показывать его) и общаться с помощью SendMessage

Для месажей окно не обязательно, есть же еще PostThreadMessage() smile


--------------------
user posted image
PM MAIL   Вверх
En_t_end
Дата 9.12.2004, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Мда почитав XI часть "Visual C++ & MFC"
понял следующие :
"Потоки - гениальны, но не просты..." smile -будет моей подписью... smile
Буду долбить потоки...
PM MAIL ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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