Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.01.2011, 12:55   #1
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
Восклицание Многопоточность showmodal и WaitForSingleObject

имеется много потоков которые в определённом условии используют вызов showmodal из synchronyze, проблема в том что 2 и более потоков могут потребовать вызов showmodal и поставить весь вызов в цикл, решил воспользоваться WaitForSingleObject, но информации о том как её использовать в потоке для вызова showmodal, что бы пока один из потоков не закончит с ней работать остальные ждут так и не нашёл. Сам вызов кода выглядит так
Код:
procedure ShowModalForm;
begin
Form2.ShowModal;
end;

.........
  try
    a := Str3;
    new2 := TStringList.Create;
    Form2.image1.Canvas.TextOut(10, 10, a);
    Syncronize (ShowModalForm);
    pipecs := Form2.edit1.text;
    except
единственное что я нашёл на вашем форуме
Код:
var t:tt;
begin
 t:=tt.Create(false);
 WaitForSingleObject(t.Handle,INFINITE);
 ShowMessage('Отработала');
 t.Free;
end;
...

tt = class(TThread)

procedure tt.Execute;
var i:integer;
begin
 for i := 0 to 10 do begin
  Sleep(100);
  //Application.ProcessMessages;
 end;
  { Place thread code here }
end;
но там WaitForSingleObject стоит на ожидание потока, а мне в потоке нужно на ожидание showmodal, может кто ни будь пролить на это свет
bulldog5293 вне форума Ответить с цитированием
Старый 20.01.2011, 13:21   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
могут потребовать вызов showmodal и поставить весь вызов в цикл
что значит в цикл?
Цитата:
но информации о том как её использовать в потоке для вызова showmodal, что бы пока один из потоков не закончит с ней работать остальные ждут так и не нашёл.
внутри синхрониз метода(не важно какого, в общем внутри синхронизации) может находится лишь один поток(считая главный) в единицу времени
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.01.2011, 14:32   #3
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

А чего вы хотите добиться, вызвав WaitForSingleObject? Узнать, а не висит ли уже главный поток внутри ShowModal()? Так это можно сделать с помощью обычного флага. Или вы хотите обождать, пока главный поток выйдет из ShowModal(), и только тогда запустить свой Synchronize()? Так Synchronize() и без вашей помощи обождёт, когда главный поток освободится.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 20.01.2011, 15:07   #4
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

тоесть при Synchronize из двух потоко доступ к showmodal имеет только один?
bulldog5293 вне форума Ответить с цитированием
Старый 20.01.2011, 15:24   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

еще проще, код внутри синхрониз может выполнять лишь один поток(и даже главный будет ждать)
(повторю, если не нарушены правила VCL, в данном случае они не нарушены)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.01.2011, 15:40   #6
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

Даже если весь Execute обёрнут в TCriticalSection
bulldog5293 вне форума Ответить с цитированием
Старый 20.01.2011, 15:41   #7
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

А MessageBox не спасет отца русской демократии ?
Она модальна и для ее вызова синхронизация с осн.потоком не требуется.
mss вне форума Ответить с цитированием
Старый 20.01.2011, 16:24   #8
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Вместо Synchronize отправляйте главному окну спец. сообщение.

По приёму сообщения главное окно покажет ShowModal-ом другое окно.

Только мне сомнительна ценность показа модального окна не по команде пользователя. Пахнет говно-софтом.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 20.01.2011, 16:35   #9
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

на подобе такого что ли?
из потока
Код:
PostMessage(Form1.Handle, WM_THREAD_COMPLETE, SS, 0);
в форму
Код:
procedure TForm1.ThreadComplete(var Message: TMessage);
begin
  if Assigned(CT[Message.WParam]) then
  begin
    CT[Message.WParam].WaitFor;
    FreeAndNil(CT[Message.WParam]);
  end;
memo1.Lines.Add('Поток завершен');
end;
bulldog5293 вне форума Ответить с цитированием
Старый 20.01.2011, 17:47   #10
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Наверное.

Только кто такой CT - не ясно. Где тут ShowModal - тоже.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Формы ShowModal SoftKoc Общие вопросы Delphi 6 18.09.2010 16:37
ShowModal, close!!!! Ital1cs Помощь студентам 3 02.04.2010 19:50
WaitForSingleObject besserebrenik Win Api 3 15.02.2010 22:40
вызов из dll не ShowModal. Roof Общие вопросы Delphi 7 25.07.2008 15:22
AlphaBlend + ShowModal Cardagant Общие вопросы Delphi 2 11.06.2008 15:42