Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2003.09.25;
Скачать: [xml.tar.bz2];

Вниз

Ожидание события   Найти похожие ветки 

 
Прохожий   (2003-09-03 09:11) [0]

Как заставить программу ждать какое то событие? Например изминения глобальной переменной. Конструкция типа reapit until Flag; просто стопорит прогу.


 
KSergey   (2003-09-03 09:13) [1]

Правильно стопит. А как же иначе? Вы написали бесконечный цикл, который ничего не делает - компьютер его честно отрабатывает. Бесконечно.

А где эта переменная должна по задумке изменяться?


 
Dmitriy O.   (2003-09-03 09:14) [2]

a:=b
If a<>b then


 
Прохожий   (2003-09-03 09:22) [3]

//А где эта переменная должна по задумке изменяться?
Ну например в обработчике события компонента, или в потоке


 
pasha_676   (2003-09-03 09:28) [4]

Простые решения (имхо)
Первое потоки.
Второе - посылать сообщение при изменении переменной.
Третье - класс в котором эта переменная суть проперти, при ее изменении идет отработка.
Собственно в зависимости от целей и задач могут применяться и какие-нибудь совместные решения.
Ну и самое простое - Application.ProcessMesage


 
Прохожий   (2003-09-03 09:31) [5]

//pasha_676 ©
Так то оно может быть и так, но для новичка в делфи - это как то всё расплывчато. Можно поподробнее, или лучше всего пример?


 
pasha_676   (2003-09-03 09:36) [6]

Что конкретно нужно. Опиши задачу. Не совсем понятна постановка вопроса.


 
Прохожий   (2003-09-03 09:43) [7]

Суть такая. В цикле создаю поток и передаю ему через конструктор параметры. Но толи он долго создаёться, то ли что. Но у одной переменной передаёться всегда только значеное, которое должно было быть для последнего потока. Вот я и хочу заставить прогу ждать, пока поток железно запуститься и начнёт работать, а уже потом разчитывать новые параметры и создавать новый поток


 
Palladin   (2003-09-03 09:49) [8]

Ну например
const
wm_value1changed=wm_user+1;

var
Value1:integer;

type
TForm1=class(Form)
....
private
{ Private declarations }
procedure Value1Changed(var msg:TMessage); message wm_value1changed;
....
end;

procedure SetValue1(v:integer);
begin
if value1<>v then
begin
value1:=v;
PostMessage(Form1.Handle,wm_value1changed,value1,0);
end;
end;

procedure TForm1.Value1Changed;
begin
Button1.Caption:=inttostr(msg.WParam);
end;


после этого если хочешь что бы Form1 уведомлялась об изменении значения, то меняй его посредством процедуры SetValue1


 
Прохожий   (2003-09-03 13:18) [9]

Ну меесажи это конечно хорошо, а как мне послать сообщение в главный модуль? Я пытаюсь передать в поток форму, а нифига не выходит. Да и не правильно это, наверное?


 
Прохожий   (2003-09-03 13:39) [10]

Что я делаю нитак?


 
Некрофил-затейник___   (2003-09-03 13:44) [11]


type
TOnChange = procedure(Sender:TObject;value:Variant) of object;//тип указатель на процедуру

TSomeClass = class
private
fx:integer;
fOnChange:TOnChange;
...
procedure SetX(value:integer);
function GetX():integer;
public
property x:integer read GetX write SetX;
...
property OnChange:TOnChange read fOnChange write fOnChange;
end;

TMainClass = class(TForm)
published
procedure Create();
..
private
...
someClass:TSomeClass;
...
procedure OnChange(Sender:TObject;value:Variant)
end;
implementation
begin
....
procedure TSomeClass.SetX(value:integer);
begin
fx := value;
if(@fOnChange <> nil)then //если указатель не равен nil
fOnChange(self,fx);//вызвать через указатель на функцию обработку
end;

function TSomeClass.GetX():integer;
begin
Result := fx;
end;

procedure TMainClass.Create();
begin
//создание экземпляра класса и присваевание указателя на функцию обработчик
SomeClass := TSomeClass.Create();
SomeClass.OnChange := OnChange;
end;

procedure TMainClass.OnChange();
begin
//исполняемый по событию код
ShowMessage("");
end;
end;


С уважением
Некрофил Затейникович Ликантроп
Nekrofil@graveyard.edu


 
pasha_676   (2003-09-03 13:45) [12]


> как мне послать сообщение в главный модуль?

Так и послать. Хотя строго говоря сообщения посылаються не модулю.


> Я пытаюсь передать в поток форму

Вот это не понятно абсолютно. Зачем? (Да и собственно как?)


 
han_malign   (2003-09-03 13:47) [13]

"ошибка в 17 строке"(с)Anatoly Podgoretsky


 
Digitman   (2003-09-03 13:48) [14]


> Прохожий


> толи он долго создаёться, то ли что


разумеется, старт нового кодового потока для системы не есть мгновенная операция...и похожа она по "тяжести" на старт холодного двигателя в мороз

проверить гарантированный старт поточной ф-ции можно, например, след. образом :

constructor TMyThread.Create(...);
begin
inherited ....;
...
// пока не существует очередь сообщений потока, крутимся в цикле
while not PostThreadMessage(ThreadId, WM_USER, 0,0) do;
...
end;

procedure TMyThread.Execute;
var
Msg: TMsg;
begin
PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE); // очередь сообщений потоку создана с этого момента

... едем дальше
end;


 
Palladin   (2003-09-03 13:50) [15]

Йоптыть.
Передавай при создании потока handle окна которым ловить хочешь.
И используй PostMessage из потоков, в чем проблема?


 
Прохожий   (2003-09-03 13:51) [16]

//Так и послать. Хотя строго говоря сообщения посылаються не модулю.
Как так?
вот строка: PostMessage(Form1.Handle,wm_value1changed,value1,0);</COD E>
Если я это пишу в модуле потока, то получаю ошибку: необявленный идентификатор Form1


 
Palladin   (2003-09-03 13:53) [17]

помоему тебе еще рано потоками заниматся...


 
Digitman   (2003-09-03 13:58) [18]


> Прохожий


> Если я это пишу в модуле потока, то получаю ошибку: необявленный
> идентификатор Form1


эт точно) ... поток там или не поток - монопенисуально)
это ж - азы Паскаля как такового !
обращение в одном из модулей к идентификатору, описанному в другом модуле, требует в первом модуле указания в разделе USES имени модуля, где этот ид-р объявлен. За редкими специсключениями)


 
Palladin   (2003-09-03 14:02) [19]

моно пени суа льно :)
слово то какое, интеллихентное, так и буду выражатся :))


 
Digitman   (2003-09-03 14:06) [20]


> Palladin


и не вздумай сказать вместо этого "индифферентно"... или - еще страшней - "безразлично") ... особливо - в обществе с присутствующими дамами) ... сразу сочтут за хама и матершинника отпетого))


 
pasha_676   (2003-09-03 14:07) [21]


> Как так?


> вот строка:PostMessage(Form1.Handle,wm_value1changed,value1,0);

ЭЭЭЭЭ.... Form1 не модуль. Модуль и объект суть вещи разные. Ну и видимость обеспечить - это как бы более базовая задача. К потокам и мессагам не имеет никакого отношения. Давай создай для тренировки две формы (для начала в одном проекте), чтоб они мессагами перекидывались.


 
han_malign   (2003-09-03 14:10) [22]

>разумеется, старт нового кодового потока для системы не есть мгновенная операция...
- в отличии от пользователя, во всяком случае, для меня 20 миллисекунд - это мгновенно...


 
Digitman   (2003-09-03 14:12) [23]


> pasha_676


> Модуль и объект суть вещи разные


да тут даже не о разных сущностях как таковых речь идет)
Символьный идентификатор и область его определения/видимости - вот что первично с т.з. алгоритм.языка ! И далеко не только Паскаля)


 
Digitman   (2003-09-03 14:14) [24]


> han_malign


вот на слишком вольной трактовке "мгновенности" сабжа автор и попался)... не попадись и ты на ней !)


 
Прохожий   (2003-09-03 14:28) [25]

// это ж - азы Паскаля как такового !
обращение в одном из модулей к идентификатору, описанному в другом модуле, требует в первом модуле указания в разделе USES имени модуля, где этот ид-р объявлен.

Не умничай. В uses всё прописано


 
han_malign   (2003-09-03 14:29) [26]

>Digitman © (03.09.03 14:14) [24]
просто, обычно ожидают завершения потока или текущей поточной операции, а вот начало потока - ни разу не было такой нужды. Разве что для взаимной синхронизации двух потоков с большой точнстью(скажем аудио<->видио), но опять таки точнее системного кванта времени потока(те же 20 мс) не получится...


 
Palladin   (2003-09-03 14:50) [27]


> Прохожий © (03.09.03 14:28) [25]

Э, парень, не хорошо так отвечать знающим людям. Ведь правду говорят. Получается ты не знаешь что нужно прописать что бы достучатся до Form1. Простой выход из ситуации с пердачей handle тебя тоже не устраивает?


 
Digitman   (2003-09-03 14:58) [28]


> han_malign


ну почему же "обычно" ?

не менее "обычна" практика передачи параметров потоку (сразу же за конструированием его класса либо прямого вызова CreateThread) через адресованные ему с пом. PostThreadMessage() сообщения... а передать таким образом параметр можно лишь убедившись, что поточная ф-ция стартовала и системой организована очередь сообщений для этого потока.. иначе сообщение-параметр канет бесследно, зачастую явившись источником потенциального мемлика (когда сообщением передается ссылка на ресурс, деаллокировать который должен поток-адресат, получающий и обрабатывающий такое сообщение)


> Прохожий © (03.09.03 14:28) [25]
> Не умничай. В uses всё прописано


ишь ты ! умник нашелся !)

чудес-то не бывает)

если компилятор , не обнаружив целевой ид-р в текущем модуле, равно как не обнаружил его и среди uses-модулей, он как раз и извещает тебе, что, мол, "такой-то идентификатор не декларирован"


 
Прохожий   (2003-09-03 15:04) [29]

// если компилятор , не обнаружив целевой ид-р в текущем модуле, равно как не обнаружил его и среди uses-модулей, он как раз и извещает тебе, что, мол, "такой-то идентификатор не декларирован"
Это всё понятно, но непонятно почему так происходит.
Модуль с потоком прописан в главном модуле. Если я в модуле потока прописываю главный модуль - получаю ошибку типа "Circelar unit reference to ... "


 
Digitman   (2003-09-03 15:05) [30]


> Прохожий


Модуль1
interface
uses Модуль2
переменная := идент-р

Модуль2
interface
..
const идент-р = значение;


 
Digitman   (2003-09-03 15:08) [31]


> главный модуль


это как понимать - "главный" ?


> получаю ошибку типа "Circelar unit reference to ... "


опять же - незнание Паскаля)

Мод1
interface
uses Мод2

Мод2
implementation
uses Мод1

это написано в любом букваре по языку


 
Прохожий   (2003-09-03 15:09) [32]

>Digitman © (03.09.03 15:05) [30]
Будем азы преподавать? А может быть ты мне раскашешь о константах, локакльных и глобавльных переменных?
Я не настолько чайник!!!


 
Прохожий   (2003-09-03 15:11) [33]

>Digitman © (03.09.03 15:08) [31]

Мод1
interface
uses Мод2

Мод2
implementation
uses Мод1

это написано в любом букваре по языку


Вот если я так пишу, то и получаю вышеозвученую ошибку


 
Digitman   (2003-09-03 15:11) [34]


> Прохожий



> Будем азы преподавать?


Желания, знаешь ли , такого у меня нет.
Давай так - ты откладываешь все свои поточные дела, берешь любой мало-мальски приличный букварь по ObjectPascal и штудируешь его от корки до корки, восполняя пробелы в соотв.знаниях)


 
Digitman   (2003-09-03 15:12) [35]


> Вот если я так пишу, то и получаю вышеозвученую ошибку


вот если ты ИМЕННО ТАК напишешь, то никаких цикл.ссылок не будет !!


 
Palladin   (2003-09-03 15:13) [36]


> Прохожий © (03.09.03 15:11) [33]

Нет ты немножко не так пишешь. Я в этом уверен.


 
han_malign   (2003-09-03 15:13) [37]

на самом деле системный квант времени 100нс, иначе Perfomance Counters не работали бы...

> не менее "обычна" практика передачи параметров потоку (сразу же за конструированием его класса либо прямого вызова CreateThread) через адресованные ему с пом. PostThreadMessage() сообщения... а передать таким образом параметр можно лишь убедившись, что поточная ф-ция стартовала и системой организована очередь сообщений для этого потока..
- а тут ничего выдумывать не надо

PostThreadMessage
.................
· Create an event object, then create the thread. Use the WaitForSingleObject function to wait for the event to be set to the signaled state before calling PostThreadMessage. In the thread to which the message will be posted, call PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE) to force the system to create the message queue. Set the event, to indicate that the thread is ready to receive posted messages.

З.Ы. А мне, обычно, хватает передачи параметров в конструкторе(перед CreateThread) и критической секции - не люблю злоупотреблять "халявными" очередями...


 
Прохожий   (2003-09-03 15:14) [38]

>от если ты ИМЕННО ТАК напишешь, то никаких цикл.ссылок не будет !!

Именно так и пишу


 
pasha_676   (2003-09-03 15:20) [39]


> Именно так и пишу

Чудес не бывает. Лучше смотри ссылки на модули, а не спорь.


 
Digitman   (2003-09-03 15:21) [40]


> Прохожий


> Именно так и пишу


не верю !) ну ни в жизнь не поверю !)

так что, собссно, у тебя есть "главный модуль"-то, а ? таки не сподобишься просветить ?


> han_malign


> А мне, обычно, хватает


ну хватает так хватает) ... я ж не настаиваю на ином)



Страницы: 1 2 вся ветка

Форум: "Потрепаться";
Текущий архив: 2003.09.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.018 c
4-82536
dima_Sh
2003-07-24 10:50
2003.09.25
Как отловить событие


1-82302
AndreyAs
2003-09-15 16:23
2003.09.25
MainMenu на Panel?


14-82402
PVOzerski
2003-09-02 16:06
2003.09.25
Запутался с JavaScript... Может, кто подскажет?


1-82307
ikivio
2003-09-13 21:01
2003.09.25
Проблемы с SW_RESTORE.


1-82314
AndB
2003-09-12 05:51
2003.09.25
uses Windows, Forms, Menus, ... частично?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский