Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.011 c
6-1143079681
vadim1
2006-03-23 05:08
2006.08.06
"Asynchronous socket error 10061".


4-1145215945
cerber
2006-04-16 23:32
2006.08.06
Как получить список всех PIPE запущеных в системе


8-1139763034
Admeral
2006-02-12 19:50
2006.08.06
Прозрачный фон?


3-1148979455
Still Swamp
2006-05-30 12:57
2006.08.06
Поделитесь заголовочным файлом для FireBird Embeded


10-1122560284
GekaNaz
2005-07-28 18:18
2006.08.06
НЕ могу вставить в Excel таблицу гиперссылку из Delphi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский