Форум: "Основная";
Текущий архив: 2002.12.19;
Скачать: [xml.tar.bz2];
ВнизThread Найти похожие ветки
← →
skiph (2002-12-05 10:45) [0]Работает поток, в ходе может его выполнения потребоваться приостановить работу на время и передать управление другой форме. После выполнения определенных действий, форма закрывается и поток снова должен возобновить свою деятельность. Проблема в том, что форма хоть и отображается, но неактивна. Пробовал передавать ей управление через Synchronize(Form2.ShowWindow), где
procedure TNewRecord.ShowWindow;
begin
NewRecord.ShowModal;
end;
Не помогает.
← →
Внук (2002-12-05 11:28) [1]Поток передает управление форме...
Давайте почетче с терминами :)
← →
Alx2 (2002-12-05 11:31) [2]>skiph © (05.12.02 10:45)
Модально покажи форму из свово потока
← →
Ihor Osov'yak (2002-12-05 11:41) [3]2 Alx2 © (05.12.02 11:31)
Иногда лучше жевать... Сорри, не удержался ...
2 skiph © (05.12.02 10:45) - Обратите внимание на Внук © (05.12.02 11:28), а так в общем - используйте посылку сообщений в основной поток а также обьекты синхронизации ...
Зы - надеюсь,что в своем потоке Вы напрямую не работаете с обьектами VCL..
← →
Alx2 (2002-12-05 12:43) [4]>Ihor Osov"yak © (05.12.02 11:41)
>Иногда лучше жевать... Сорри, не удержался ...
Да ничего... потом, глядишь, получится.
По теме:
"в ходе может его выполнения потребоваться приостановить работу на время и передать управление другой форме. После выполнения определенных действий, форма закрывается и поток снова должен возобновить свою деятельность"
Отбросим, конечно, терминологическую несуразицу автора.
Если рассмотреть основной поток+модальная форма. Зачем городить огород, если однопоточная модель так и работает?
← →
NailS (2002-12-05 13:15) [5]SendMessage ?
← →
skiph (2002-12-06 06:09) [6]to Alx2
Извиняюсь - очепятка.
А суть задумки такая: перебрасываются данные из одной БД в другую, причем для некоторых строковых полей в старой базе, в новой заводятся справочники. Прочитав значение такого поля, я ищу в справочнике уже имеющуюся соответствующую запись. Если таковая не найдена, я должен спросить у пользователя: добавить это значение в справочник или заменить на другое значение (в случае если запись сделана с ошибкой). Для этого и открываеся форма.
При это работа потока не останавливается, а лишь приостанавливается на время и после того, как пользователь сделает выбор, продолжает работу с той точки, на которой
← →
Alx2 (2002-12-06 08:10) [7]>skiph © (06.12.02 06:09)
В данном примере Synchronize не нужно.
procedure TMyThread.DoMessage;
begin
case MessageBox(0, "Нажмите на кнопку", "Ответьте на вопрос:", MB_YESNO or MB_DEFBUTTON1 or MB_ICONQUESTION) of
IDYES : ShowMessage("Нажато YES");
IDNO : ShowMessage("Нажато NO");
end;
end;
procedure TMyThread.Execute;
begin
DoMessage;
end;
А в этом примере Synchronize нужно. Так как используются глобальные незащищенные объекты Screen и т.д.
procedure TMyThread.DoMessage;
begin
with TForm.create(Nil) do
begin
ShowModal;
free;
end;
end;
procedure TMyThread.Execute;
begin
Synchronize(DoMessage);
end;
Таким образом, рисуешь свой диалог с нужной дополнительной инфой, модально и синхронизированно кажешь его из своего потока и в зависимости от выбора пользователья продолжаешь работу.
← →
Alx2 (2002-12-06 08:15) [8]>Alx2 © (06.12.02 08:10)
Вдогонку. По инерции в первом примере воткнул ShowMessage. Он тоже требует Synchronize.
← →
Ihor Osov'yak (2002-12-10 10:50) [9]2 Alx2 © (06.12.02 08:10)
← →
Ihor Osov'yak (2002-12-10 11:00) [10]2 Alx2 © (06.12.02 08:10)
> синхронизированно кажешь его из своего потока и в зависимости
> от выбора пользователья продолжаешь работу.
При вызове через синхронайз "подсинхронайзнутая" функция выполняется в контексте главного потока. Это можете расценить как комментарий к вашему "из своего потока" ...
2 skiph © (06.12.02 06:09)
Такая схема должно работать. Если форма с вопросом создавалась восновном потоке, а ее активация идет через синхронайз и в тоже времмя цікл віборки основного потока не приторможен. То есть, если у вас проблемы - то форму с вопросом вы создавали в рабочем потоке (очень оригинально), либо у Вас приторможен цыкл выборки главного потока (к ппримеру, вы ожидаете завершения рабочего потока через какой-то обьект синхронизации).
Зы - а вопрос можно задать и через апишный, к примеру см.
Alx2 © (06.12.02 08:10) (в этой части он прав)
MessageBox(0, "Нажмите на кнопку", "Ответьте на вопрос:", MB_YESNO or MB_DEFBUTTON1 or MB_ICONQUESTION) - єта вещь вполне потокобезопасна, можно візівать с любого потока и не заботится о синхронизации и проблемами с блокировками ...
← →
Alx2 (2002-12-10 12:24) [11]>Ihor Osov"yak © (10.12.02 11:00)
>При вызове через синхронайз "подсинхронайзнутая" функция
>выполняется в контексте главного потока. Это можете расценить
>как комментарий к вашему "из своего потока" ...
Угу. Конечно. Но имхо это уже буквоедство. Так можно докатиться до фраз "переходишь в режим ядра и создаешь новый объект синхронизации"
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.12.19;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.083 c