Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 [4] 5   вперед  Ctrl      все
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 51619
Блог
Bellic
Можете меня расстрелять, но Он прекрасно работает!..)))

Попробуй, пока он работает, нажать, скажем, крестик в правом верхнем углу.
3 янв 18, 16:57    [21080300]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
Bellic
Member

Откуда: Ростов-на-Дону
Сообщений: 123
Freedoom, очень интересно получилось! Класс!
(Нет явного цикла ожидания, доп.потока и TAG использован по совету парней!)
Архив проекта прилагается...)
3 янв 18, 17:02    [21080312]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 2609
Bellic
Freedoom, очень интересно получилось! Класс!
(Нет явного цикла ожидания, доп.потока и TAG использован по совету парней!)

Жаль только электроэнергии за нагрузку процессора в 100% и тормозов компьютера из-за этого.
3 янв 18, 17:06    [21080317]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
Bellic
Member

Откуда: Ростов-на-Дону
Сообщений: 123
softwarer
Попробуй, пока он работает, нажать, скажем, крестик в правом верхнем углу.
Ничего не произошло, и по крайней мере от Крестика я буду избавляться вообще!
Ну нельзя закрывать окно посредине открытого цикла!
Но это уже мелочи и совсем другая история...
3 янв 18, 17:15    [21080324]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 2609
Bellic
Ну нельзя закрывать окно посредине открытого цикла!
Даже если пользователь передумал ждать окончания твоего цикла?
3 янв 18, 17:19    [21080329]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
Bellic
Member

Откуда: Ростов-на-Дону
Сообщений: 123
YuRock
Жаль только электроэнергии за нагрузку процессора в 100% и тормозов компьютера из-за этого.

Тормозов не наблюдается, а скачек нагрузки на CPU - c 25 до 50%. Это много?
Можно если захочется - таймером ворон на ветках посчитать!..)))
3 янв 18, 17:26    [21080338]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
Bellic
Member

Откуда: Ростов-на-Дону
Сообщений: 123
YuRock
Даже если пользователь передумал ждать окончания твоего цикла?
Выход из процедуры будет возможен только по кнопке Выход, с корректными действиями.
А сам расчет (в Тестовом варианте - это счет от 0 до 500 и от 501 до 1000 и т.д.) в Реальном цикле выполняется достаточно быстро, так что юзер и не успеет мышкой на Крестик навести (Если он его еще сумеет найти на форме)!..)
3 янв 18, 17:32    [21080343]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 2609
Bellic
а скачек нагрузки на CPU - c 25 до 50%. Это много?

Значит у тебя 4 процессора (ядра). На одном уже "работала" подобная "программа", а эта запустилась на другом.
А если бы было одно ядро - нагрузка была бы 100.
Но не отчаивайся, и на многоядерных компьютерах, все программы, GUI-поток которых работал на том процессоре, который ты отправил в кому, будут тормозить.
Много это или не много - пользователям твоей программы решать.
3 янв 18, 17:34    [21080345]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
Bellic
Member

Откуда: Ростов-на-Дону
Сообщений: 123
YuRock
Значит у тебя 4 процессора (ядра). На одном уже "работала" подобная "программа", а эта запустилась на другом.
А если бы было одно ядро - нагрузка была бы 100.
Но не отчаивайся, и на многоядерных компьютерах, все программы, GUI-поток которых работал на том процессоре, который ты отправил в кому, будут тормозить.
Много это или не много - пользователям твоей программы решать.
Да, верно, у меня 4 ядра!..)
С Одним ядром - это Pentium-1 что ли? Так мой уже такой давно на свалке!..))
А программа реальная - для узконаправленного круга пользователей пишется - для себя, ну максимум еще может для 2-х других друзей!

Ну а будут тормоза - можно и твоим Потоковым вариантом воспользоваться! - Он судя по индикатору - вообще не грузит процессор!..)
Надеюсь проблем, обращения из Потоковой процедуры к другим функциям и процедурам, не должно быть?!
3 янв 18, 17:59    [21080363]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 2609
Bellic
С Одним ядром - это Pentium-1 что ли?

В твоём случае, если б у тебя было 2 ядра, оба стали б заняты (т.к. 1-е уже кто-то занял).
Не, если не жалко электроэнергии и нервов, плевать на прокляться благодарных пользователей - я ж не против.

Bellic
Потоковой процедуры к другим функциям и процедурам, не должно быть

Функциям и процедуры, как и память, не принадлежат какому-то потоку. Их можно использовать из любого.
Только поток кода будет хоть и одинаков, если вызывать одну функцию в разных потоках, но их будет несколько, а вот память - одна на всех.
3 янв 18, 18:08    [21080381]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 44070

Bellic
скачек нагрузки на CPU - c 25 до 50%. Это много?

Это полный П. У правильно написанной программы в покое должно быть нулевое потребление ЦПУ.

Posted via ActualForum NNTP Server 1.5

3 янв 18, 18:13    [21080388]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
Bellic
Member

Откуда: Ростов-на-Дону
Сообщений: 123
YuRock, Кстати - добавил Sleep(1); в ЭТОТ КОД, и процент загруженности вообще упал, проверь:
while FRes = 0 do
begin
  Sleep(1);
  Application.ProcessMessages;
end;

- Без Sleep(1) -- 25-27% в ожидании нажатия клавиш;
- Со Sleep(1) -- загрузка в ожидании практически не увеличилась (1-5%)!
3 янв 18, 18:18    [21080396]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 796
Продолжаем дальше фигнёй страдать??)) А вот воспользовались бы таймером, даже в потоке. То не пришлось бы заниматься такими оптимизациями)))
3 янв 18, 18:25    [21080401]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 796
Тем более, applicationevents сообщит о нажатии клавиши. И вообще не надо никаких собственных крутых for-ов
3 янв 18, 18:26    [21080405]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
rgreat
Member

Откуда:
Сообщений: 3860
Bellic,

А теперь попробуй закрыть программу крестиком.
3 янв 18, 18:30    [21080411]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 2609
Bellic
YuRock, Кстати - добавил Sleep(1); в ЭТОТ КОД, и процент загруженности вообще упал, проверь:
while FRes = 0 do
begin
  Sleep(1);
  Application.ProcessMessages;
end;


- Без Sleep(1) -- 25-27% в ожидании нажатия клавиш;
- Со Sleep(1) -- загрузка в ожидании практически не увеличилась (1-5%)!

Не хочу я пробовать
Это мрак. Что со слипом, что без.
3 янв 18, 18:41    [21080433]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
Bellic
Member

Откуда: Ростов-на-Дону
Сообщений: 123
rgreat
Bellic, А теперь попробуй закрыть программу крестиком.
rgreat, Вы похоже Тему вообще не читаете!?
ВОТ ТУТ я уже ответил на этот вопрос!
Ну нету у меня на Реальной форме КРЕСТИКА!!! На Тестовой форме он конечно имеется, но я не буду туда нажимать!
Я форму создавал сразу без крестиков, значков сворачивания и минимизаций! Что бы потом вопросов не было!..)
3 янв 18, 18:44    [21080440]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2193
Беллик, сделай нормально, правда :) Тебе же самому будет лучше и проще потом. Не надо потоков бояться, всё там с ними просто, если один раз разобраться. ProcessMessages - это, как правило, костыль, хоть со слипом, хоть без. Рано или поздно он гарантированно вылезет боком. Причём в таком месте, что вообще никак не связано напрямую с кодом. И вот тогда всю голову сломаешь, почему глючит.
3 янв 18, 18:49    [21080456]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
Bellic
Member

Откуда: Ростов-на-Дону
Сообщений: 123
Няшик
Продолжаем дальше фигнёй страдать??)) А вот воспользовались бы таймером, даже в потоке. То не пришлось бы заниматься такими оптимизациями)))
А кто Вам мешает написать свой вариант на основе моего Тестового и приложить к сообщению полный рабочий проект(без ошибок ток)?
Тем более, applicationevents сообщит о нажатии клавиши. И вообще не надо никаких собственных крутых for-ов

Няшик, мне на пиво братишка позвал, к сожалению вернусь только завтра, но я хотел бы Заценить и Ваш вариант с Таймером и Эвентсами!
3 янв 18, 18:53    [21080459]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
rgreat
Member

Откуда:
Сообщений: 3860
Bellic,

Хех, присоединюсь к остальным: Страдай фигней, на здоровье.
3 янв 18, 18:57    [21080469]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
Bellic
Member

Откуда: Ростов-на-Дону
Сообщений: 123
makhaon
Беллик, сделай нормально, правда :) Тебе же самому будет лучше и проще потом. Не надо потоков бояться, всё там с ними просто, если один раз разобраться. ProcessMessages - это, как правило, костыль, хоть со слипом, хоть без. Рано или поздно он гарантированно вылезет боком. Причём в таком месте, что вообще никак не связано напрямую с кодом. И вот тогда всю голову сломаешь, почему глючит.

Да я собственно с Потоков и начинал тему, до этого просто никогда не работал с ними!
Но по ходу оказалось, что можно и без них обойтись, и код очень коротким получался ведь!?

А что касается ProcessMessages, то я им и в других затяжных процедурах пользуюсь, чтоб избавиться от "Программа не отвечает"(или как там?) в шапке форм! А как по другому этого избежать?
Вот недавно сравнительно узнал, что можно ProgressBar.Refresh делать!
3 янв 18, 19:01    [21080474]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
Док
Member

Откуда: Казань
Сообщений: 5299
дивлюсь я вам, мужики. Вместо того, чтобы доедать оливье и в телик пялиться, вы домашку школьнику, пересевшего с бейсика на паскаль, делаете. Да и еще с ним аргументированно спорить пытаетесь
3 янв 18, 19:11    [21080488]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2193
Док,

Не знаю, как кто, я уже оливье с шубой объелся Хватит, надо калории немного потратить ) Пациент не совсем упоротый, шансы есть.
3 янв 18, 19:14    [21080493]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 796
Bellic,

У меня всё без ошибок работает. Ошибки делаешь ты...

Это задача вообще на 10 - 20 минут в реализации.

Может бы начал с чего нибудь полегче ????


Няшик
Циклы к слову вообще не нужны, уже есть ApplicationEvents

Можно и так сделать ведь
+
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  if Msg.message = 513 then
  begin
    if not SButtonEnebled then
    begin
      if Msg.hwnd = SButton.Handle then
        SButtonEnebled := true
      else
        Memo1.Lines.Add('Кряя. Надо нажать на SButton');
      exit;
    end;

    if Msg.hwnd = Button1.Handle then
      Memo1.Lines.Add('Нажата кн."Продолжить"')
    else if Msg.hwnd = Button2.Handle then
      Memo1.Lines.Add('Нажата кн."Пропустить"')
    else if Msg.hwnd = Button3.Handle then
      Memo1.Lines.Add('Счет Остановлен!')
    else
      exit;

    SButtonEnebled := false;
  end
  else if Msg.message = 257 then
  begin
    Memo1.Lines.Add('Нажата кнопка: ' + chr(Msg.wParam));
  end;
end;
3 янв 18, 19:28    [21080514]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 796
makhaon,

Я уже поправился на 8 кг... Тяжело ходить даже стало xD
3 янв 18, 19:30    [21080519]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 [4] 5   вперед  Ctrl      все
Все форумы / Delphi Ответить