powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Использование TTask - как правильно?
26 сообщений из 26, показаны все 2 страниц
Использование TTask - как правильно?
    #40125313
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашел два примера кода:
1) http://www.proghouse.ru/programming/36-delphi-xe7-ppl
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
procedure TForm1.Button1Click(Sender: TObject);
var
   task: ITask;
begin
   //Создаём задачу.
   task := TTask.Create(procedure ()
      begin
         //Выполняем задачу 3 секунды.
         Sleep(3000);
         //Задача выполнена!
         ShowMessage('Задача выполнена!');
      end);
   //Запускаем задачу.
   task.Start;
end;



2) https://docwiki.embarcadero.com/RADStudio/Sydney/en/Using_TTask_from_the_Parallel_Programming_Library
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
procedure TForm1.Button1Click(Sender: TObject);
var
 aTask: ITask;
begin
 aTask := TTask.Create(
   procedure
   begin
     sleep (3000); // 3 seconds
     TThread.Synchronize(TThread.Current,
       procedure
       begin
         ShowMessage ('Hello');
       end);
   end);
   aTask.Start;
end;



Доверия оф.докам больше, но почему в 1-м примере не используется TThread.Synchronize для ShowMessage? Так тоже можно? Просьба объяснить: в чем различие между двумя примерами использования TTask.
...
Рейтинг: 0 / 0
Использование TTask - как правильно?
    #40125314
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiYingпочему в 1-м примере не используется TThread.Synchronize для ShowMessage?

Потому что его писал обычный дельфийский рукожоп.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Использование TTask - как правильно?
    #40125596
Mik86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
https://docwiki.embarcadero.com/RADStudio/XE7/en/Using_TTask_from_the_Parallel_Programming_Library
Забавно, но в старой версии тоже без Synchronize.
...
Рейтинг: 0 / 0
Использование TTask - как правильно?
    #40125604
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiYing
Доверия оф.докам больше, но почему в 1-м примере не используется TThread.Synchronize для ShowMessage? Так тоже можно?
В данном случае - можно.
Оконные сообщения будут прилетать в поток который создал окно, а оно создается при каждом вызове ShowMessage.
Разница в том, что в случае нескольких задач с Synchonizе() окна с сообщениями будут появляться последовательно, а без - как получится.
...
Рейтинг: 0 / 0
Использование TTask - как правильно?
    #40125606
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис
Оконные сообщения будут прилетать в поток который создал окно, а оно создается при каждом вызове ShowMessage
ShowMessage, в отличие от MessageBox, это VCL-ная хрень и из потока работать не будет
...
Рейтинг: 0 / 0
Использование TTask - как правильно?
    #40125607
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Соколинский Борис
Оконные сообщения будут прилетать в поток который создал окно, а оно создается при каждом вызове ShowMessage
ShowMessage, в отличие от MessageBox, это VCL-ная хрень и из потока работать не будет
Ну почему, будет, только плохо)
...
Рейтинг: 0 / 0
Использование TTask - как правильно?
    #40125613
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский БорисОконные сообщения будут прилетать в поток который создал окно

Некоторые сообщения - в поток, который создал окно в showMessage. Остальные - в
главный, создавший все остальные. Но самые забавные глюки могут быть в момент
когда ShowMessage из второго потока запрещает окна, созданные в первом. Не
говоря уже о опостылевшем Z-order после Alt-Tab.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Использование TTask - как правильно?
    #40125621
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
. Но самые забавные глюки могут быть в момент
когда ShowMessage из второго потока запрещает окна, созданные в первом.
По идее, такого быть не должно. Не помню как в VCL реализовано - cкорее всего там блокируются только окна, созданные в рабочем потоке.
С наложением окон, конечно, будет полная фигня.
...
Рейтинг: 0 / 0
Использование TTask - как правильно?
    #40125627
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский БорисНе помню как в VCL реализовано - cкорее всего там блокируются только окна,
созданные в рабочем потоке.

Насколько я помню - по списку из Application.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Использование TTask - как правильно?
    #40125635
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Соколинский Борис
Оконные сообщения будут прилетать в поток который создал окно, а оно создается при каждом вызове ShowMessage
ShowMessage, в отличие от MessageBox, это VCL-ная хрень и из потока работать не будет

Сам-то проверил или интуитивные заключения?))
...
Рейтинг: 0 / 0
Использование TTask - как правильно?
    #40125749
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad F
_Vasilisk_
пропущено...
ShowMessage, в отличие от MessageBox, это VCL-ная хрень и из потока работать не будет

Сам-то проверил или интуитивные заключения?))
а чо там проверять-то?
ShowMessage построен на VCL-ной TMessageForm, в отличие от MessageBox который напрямую дёргает Win API.
Если конечно это не Application.MessageBox
...
Рейтинг: 0 / 0
Использование TTask - как правильно?
    #40125758
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

Хочу понять, вот всё-таки, что будет?))
...
Рейтинг: 0 / 0
Использование TTask - как правильно?
    #40125770
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну, можно ещё гвоздиком в розетку потыкать.
тут уж как повезёт - если на 0 попасть, то и ничего.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Использование TTask - как правильно?
    #40125775
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче, ясно. В данном конкретном случае, - распространение неподтвержденных фобий. :-Ь
...
Рейтинг: 0 / 0
Использование TTask - как правильно?
    #40125786
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad Fчто будет?))

То же, что и при прочих проблемах многопоточности в руках чайников: внезапные
глюки, на которые пользователи матерятся, а аффтары разводят руками "не могу
воспроизвести, не могу исправить".

Например: "иногда, когда я закрываю форму, программа падает с AV". Что сможет
сделать чайник? Ничего. А всего-то ShowModal из фонового потока как раз в это
время идёт по списку Application.Forms и вылетает за его пределы из-за того, что
одна в процессе удалилась.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Использование TTask - как правильно?
    #40125795
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad F
Короче, ясно. В данном конкретном случае, - распространение неподтвержденных фобий. :-Ь


Лично мне приходилось разбираться к глюками, связанными с вызовом ShowMessage из доп. потока.
Думаю, и многие другие сталкивались.
Поэтому информация верная. Но можешь продолжать использовать. А то скучно жить без постоянной обратной связи от пользователей.
...
Рейтинг: 0 / 0
Использование TTask - как правильно?
    #40125810
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad F
Короче, ясно. В данном конкретном случае, - распространение неподтвержденных фобий. :-Ь
Банальный пример
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
function DisableTaskWindows(ActiveWindow: HWnd): TTaskWindowList;
var
  SaveActiveWindow: HWND;
  SaveWindowList: TTaskWindowType;
  EnumProc: TFNWndEnumProc; // keep a reference to the delegate!

  procedure ProcessWMEnableMessages;
  var
    Msg: TMsg;
  begin
    while PeekMessage(Msg, 0, WM_ENABLE, WM_ENABLE, PM_REMOVE) do
      DispatchMessage(Msg);
  end;

begin
  { The following is to work-around an issue with WindowsXP that causes
    disabled windows to be re-enabled if the application doesn't process
    messages for a certain timeout period.  Windows posts a WM_ENABLE message
    that tells the window to re-enable, so unless we process that message,
    we don't know that it is about to be re-enabled so DoDisableWindow will
    ignore the window since it thinks it is still disabled.  So when the app
    begins to process messages again, the WM_ENABLE is allowed through and the
    window is then re-enabled causing dialogs to show behind other windows. }
                                                                                       
//  ProcessWMEnableMessages;
  SaveActiveWindow := TaskActiveWindow;
  SaveWindowList := TaskWindowList;
  TaskActiveWindow := ActiveWindow;
  TaskWindowList := nil;
  EnumProc := @DoDisableWindow;
  try
    DisablingWindows := True;
    try
      EnumThreadWindows(GetCurrentThreadID, EnumProc, 0);
      Result := TaskWindowList;
    except
      EnableTaskWindows(TaskWindowList);
      raise;
    end;
  finally
    DisablingWindows := False;
    TaskWindowList := SaveWindowList;
    TaskActiveWindow := SaveActiveWindow;
  end;
end;

Найти в коде глобальные переменные и как DisableTaskWindows относится к ShowMessage - задание на дом
...
Рейтинг: 0 / 0
Использование TTask - как правильно?
    #40125820
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

Я ничего не хочу "продолжать использовать". Ибо не начинал.
Хотел понять, конкретно этот, подвергающийся сейчас поруганию пример,
хоть кто-то из поругателей проверил? Что будет конкретно?
Ладно, проехали, все понятно уже.
...
Рейтинг: 0 / 0
Использование TTask - как правильно?
    #40125825
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad F
хоть кто-то из поругателей проверил? Что будет конкретно?
Я привел один из проблемных кусков кода, который в многопоточной среде будет вести себя непредсказуемо. Вам этого не достаточно?
...
Рейтинг: 0 / 0
Использование TTask - как правильно?
    #40125861
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad F,

Чем 'конкретно этот, подвергающийся сейчас поруганию пример' отличается от любого другого работающего в доп потоке? Думаешь TTask дает какую-то дополнительную магию потоку? Нет. А про проблемы уже сотни раз сказано и тут в том числе.
...
Рейтинг: 0 / 0
Использование TTask - как правильно?
    #40125879
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

Ничего такого не думаю. ))
Просто стало вдруг интересно, удастся ли добиться от конкретно поруганного примера хоть какого-то фатализма практически.
Ну что, - так и не попробует никто? ;)
...
Рейтинг: 0 / 0
Использование TTask - как правильно?
    #40125881
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad FНу что, - так и не попробует никто? ;)

Ты как маленький, ей-богу. Проблемы синхронизации при многопоточности -
вероятностны, чем и страшны. Пока дуракам везёт - интернет полнится кодом,
который работает в 999999 случаях из миллиона и падает в самый непредсказуемый
момент. После чего - см.выше. И заодно, как типичный пример сообщения о проблеме и реакции на него - https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1327144&msg=22396462
...
Рейтинг: 0 / 0
Использование TTask - как правильно?
    #40125916
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Банальный пример
Найти в коде глобальные переменные и как DisableTaskWindows относится к ShowMessage - задание на дом

Самое интересное, что никого не трогал, просто спросил, - сам то проверил или нет?
А он вместо того, чтобы честно ответить - семиэтажный банальный пример, да ещё (старому учителю информатики) задание на дом.
Слюшай, обидно, да?((
...
Рейтинг: 0 / 0
Использование TTask - как правильно?
    #40125921
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad F
Самое интересное, что
Ты уже не первый день споришь с тем, что несинхронизированный доступ к глобальным переменным из разных потоков приводит к ошибкам.
Нет в этом ничего интересного, рутина.
...
Рейтинг: 0 / 0
Использование TTask - как правильно?
    #40125925
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

Спорю? Не первый день?? Однако может ты поруганный пример кода проверил???
Тогда это многое объясняет.))
...
Рейтинг: 0 / 0
Использование TTask - как правильно?
    #40125929
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad F
Однако может ты поруганный пример кода проверил???
Конечно проверил. Глазами. Увидел в нём логические ошибки, и мнеьэтого достаточно.
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Использование TTask - как правильно?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]