Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Использование TTask - как правильно? / 25 сообщений из 26, страница 1 из 2
09.01.2022, 13:49
    #40125313
LiYing
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование TTask - как правильно?
Нашел два примера кода:
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
09.01.2022, 13:52
    #40125314
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование TTask - как правильно?
LiYingпочему в 1-м примере не используется TThread.Synchronize для ShowMessage?

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

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

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

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

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

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

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

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


Лично мне приходилось разбираться к глюками, связанными с вызовом ShowMessage из доп. потока.
Думаю, и многие другие сталкивались.
Поэтому информация верная. Но можешь продолжать использовать. А то скучно жить без постоянной обратной связи от пользователей.
...
Рейтинг: 0 / 0
11.01.2022, 15:59
    #40125810
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование TTask - как правильно?
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
11.01.2022, 16:24
    #40125820
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование TTask - как правильно?
DmSer,

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

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

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

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

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

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


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