Форум: "Начинающим";
Текущий архив: 2006.08.06;
Скачать: [xml.tar.bz2];
ВнизФункция, ожидающая поступления данных (как showmodal) Найти похожие ветки
← →
Mr tray (2006-07-15 01:01) [0]Здравствуйте. Я хочу сделать такую штуку. Есть код в юните, который в данный момент выполняется. В какой то миг приходит очередь выполниться одной функции, задача которой остановить выполнение кода, дождаться поступления данных извне, обработать полученные данные, выдать определенный результат и пустить выполняться код дальше. Можно сделать это с помощью цикла, выход из которого возможен только после изменения определенной глобальной переменной (которая будет изменена извне). Но хотелось бы, чтоб это выглядело, примерно как a:=myform.showmodal; case a of .... и тп. Только вместо showmodal моя функция.
← →
DrPass © (2006-07-15 01:17) [1]WaitForSingleObject / WaitForMultipleObjects подойдут?
← →
Mr tray (2006-07-15 01:29) [2]а Х их знает..... я не знаю, как их использовать. Если поможете, буду премного благодарен.
← →
Mr tray (2006-07-15 01:50) [3]как я понимаю, waitforsingleobоect может следить только за объектами определенных категорий. можно ли как то подогнать мой случай под эти условия, чтоб можно было применить waitforsingleobоect?
← →
DrPass © (2006-07-15 02:54) [4]В общем случае можно. Есть "пользовательские" объекты, например, Event"ы. Ты можешь в нужной ситуации запустить event, и ожидающая его функция сразу же продолжит работу.
← →
Loginov Dmitry © (2006-07-15 08:23) [5]> а Х их знает..... я не знаю, как их использовать
- Создание Eventa: H = CreateEvent(nil, True, True, nil);
- Ожидание: WailForSingleObject(H, DWORD(-1)) - если объект-событие в состоянии "Откл", то замораживает текущий поток до тех пор, пока его состояние не станет "Вкл".
- SetEvent(H) - переход в состояние "Вкл"
- ResetEvent - переход в состояние "Откл"
- CloseHandle(H) - "уничтожение" объекта-события. Делается в самом конце, когда объект уже не нужен.
← →
Kolan © (2006-07-15 10:44) [6]
> а Х их знает..... я не знаю, как их использовать. Если поможете,
> буду премного благодарен.
Подойдут..
Но учти если ты будешь ждать в главном потоке, то на время ожидания приложение "повиснет". Поэтому для ожидания заведи дополнительный поток. Кроме этих ф-ций вполне подойдут методы потока(классаTThread
) -Suspend
иResume
.
← →
Ketmar © (2006-07-15 11:21) [7]хм. суспендить поток чревато. мало ли, где он там остановится...
← →
Leonid Troyanovsky © (2006-07-15 11:33) [8]
> Mr tray (15.07.06 01:50) [3]
> за объектами определенных категорий. можно ли как то подогнать
> мой случай под эти условия, чтоб можно было применить waitforsingleobоect?
Можно, например, ожидать завершения потока (TThread.Handle)
Ну, а это - как можно ожидать:
http://groups.google.com/group/fido7.ru.delphi.chainik/msg/c355993ba823b53c
--
Regards, LVT.
← →
Mr tray (2006-07-15 13:00) [9]а как запихнуть юнит в другой поток (если так, конечно, можно выразиться)?
← →
Kolan © (2006-07-15 13:28) [10]
> а как запихнуть юнит в другой поток (если так, конечно,
> можно выразиться)?
Так конечно выражаться не правильно...
Для этого есть класс TThread + F1.
← →
Kolan © (2006-07-15 13:30) [11]
> хм. суспендить поток чревато. мало ли, где он там остановится.
> ..
А что череватого? Делале дела, заснул, как данные пришли, его будят... Но можно и Wait функциями...
← →
Ketmar © (2006-07-15 16:39) [12]>Kolan © (15.07.06 13:30) [11]
а если он замер в "позе зю"? и потом из этой позы выпал? не надо суспендить потоки без нужды. лучше WaitForXXX().
← →
Mr tray (2006-07-15 19:14) [13]Так. Значит. Делаю так:
unit gameSystem;
interface
uses
messages,windows,classes;
type
... типы ...
Ttype=class(Tthread)
... разная дребедень ...
public
ev:thandle;
constructor create(b:boolean);
end;
implementation
constructor Ttype.create(b:boolean);
begin
inherited create(b);
ev:=CreateEvent(nil, True, false, nil);
waitforsingleobject(ev,INFINITE);
... и тд ...
end;
end.
Но на ttype.create, а именно на waitforsingleobject, ВСЯ моя программа повисает. ttype.create я вызываю при create главной формы моего приложения. Что я делаю не так?
← →
Джо © (2006-07-15 19:17) [14]> а именно на waitforsingleobject, ВСЯ моя программа повисает.
А чего же ты добивался, как не этого?
← →
Джо © (2006-07-15 19:18) [15]Поток (в данном случае, главный) был заморожен до возникновения события.
← →
Kolan © (2006-07-15 21:24) [16]Кажется про потоки ты недочитал... Читай про Execute..
PS
И оформлять научись.. читать трудно..
← →
Mr tray (2006-07-15 22:36) [17]
> И оформлять научись.. читать трудно..
А как я должен оформить, покажи, пожалуйста.
← →
Mr tray (2006-07-15 23:32) [18]
constructor Ttype.create(b:boolean);
begin
inherited create(b);
execute;
end;
procedure Ttype.execute;
begin
ev:=CreateEvent(nil, True, false, nil);
waitforsingleobject(ev,INFINITE);
... и тд ...
end;
Всё равно виснет. Читал хелп. Там сказано: в execute должна содержаться функция потока (The Execute method is your thread function). Что я ещё должен сделать, чтоб всё работало?
← →
Mr tray (2006-07-15 23:52) [19]аа. всё. врубился вроде. вместо execute надо resume написать?
← →
Kolan © (2006-07-16 00:26) [20]
> А как я должен оформить, покажи, пожалуйста.
http://www.citforum.ru/programming/delphi/style_delphi/
Те не:
> waitforsingleobject(ev,INFINITE);
а,WaitForSingleObject(Ev,INFINITE);
> аа. всё. врубился вроде. вместо execute надо resume написать?
Таак.... краткий обзор.
Код помешенный в Execute выполнится в контексте потока.
Далее смотрим пост 1
Всю работу вставляещь в поток, затем ожидание, затем то что надо сделать кода данные пришли.
Те пример:procedure Execute;
begin
{Создали Event.}
{Работаем}
if WaitForSingleObject(ev,INFINITE) = WAIT_OBJECT_0 then //Ждем
{Дождались, делаем остальное}
{В конце выдали результат с помощью любого механизма: SendMessage, событие итд... }
end;
Далее.create(b:boolean);
Если B = True, то по ток создасться спящим.
Кроме того не забудь перекрыть(override) метод Execute.
> Всё равно виснет
Странный вопрос. Значит ты что-то оставил в гл. потоке.
PS
Незабудь что почти вся VCL НЕ потоко безапасна. Поэтому используй механизмы синхранизации(Synchronize
например) для вывода результатов работы.
PPS
А вообще гораздо проще прочесть Тейкста и Пачеко и все на места встанет...
← →
Kolan © (2006-07-16 00:28) [21]
> аа. всё. врубился вроде. вместо execute надо resume написать?
Как это - вообще бред, где написать , зачем...
Если поток создан НЕ спящим Execute стартует после создания...
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.08.06;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.01 c