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

Вниз

Можно ли создать событие на изменение переменной?   Найти похожие ветки 

 
Ingwar ©   (2006-10-27 00:41) [0]

Сейчас пока сделал поток, который следит за изменением переменной... Только эта зараза жрет все ресурсы процессора. Может возможно сделать  это как-нить по другому?


procedure ThreadDemo.Execute;
begin
 repeat
 if (Head<>Read) then
 begin
   Synchronize(Update);
 end;
 until False
end;


 
DrPass ©   (2006-10-27 00:49) [1]

Переделать логику таким образом, чтобы не было Synchonize, и еще добавить в цикл sleep(<сколько можно>)


 
Leonid Troyanovsky ©   (2006-10-27 00:52) [2]


> Ingwar ©   (27.10.06 00:41)  

> Сейчас пока сделал поток, который следит за изменением переменной.


Сделай лучше свойство (property), скажем, у формы.

--
Regards, LVT.


 
MetalFan_pda   (2006-10-27 00:55) [3]

а как поток завершится,если в н6м безусловный бесконечный цикл??ужас!
а если проперти сделать,с отслеживанием ее изменения вроде проблемы быть не должно...


 
Ingwar ©   (2006-10-27 00:58) [4]

То DrPass: В той доке которую я читал про поток написано, что отображение на форму надо делать через Synchonize... А у меня как раз обновление формы по при приходу данных... А Head и Read это указатели на кольцевой буфер.

То Leonid Troyanovsky: А можно чуть поподробней? А то я никогда не сталкивался с подобным...

Заранее благодарен за любые посказки!


 
Gero ©   (2006-10-27 00:59) [5]

Переменную кто меняет? Ты? Тогда ты и так знаешь, когда она меняется, ничего отслеживать не нужно.


 
Ketmar ©   (2006-10-27 00:59) [6]

>[0] Ingwar(c) 27-Oct-2006, 00:41
читай про CreateEvent(), PulseEvent(), WaitForSingleObject(). вместе с изменением переменной дёргай event. в потоке -- WaitForSingleObject(). жрать ресурсы перестанет.

(это развёрнутое изложение [1] %-)


 
Ingwar ©   (2006-10-27 01:01) [7]

То MetalFan_pda: Завершится легко... При завершении приложения.

Так уже второй человек говорит про свойство... Пойду капать в эту сторону... Но если будут более конкретные подсказки (с фрагментом кода) я не обижусь =)


 
Ingwar ©   (2006-10-27 01:05) [8]

ТО Ketmar: Ты как всегда рулишь... Коротко и ясно =)


 
DrPass ©   (2006-10-27 01:07) [9]


> В той доке которую я читал про поток написано, что отображение
> на форму надо делать через Synchonize

Правильно написано. Но там не написано, что при использовании Syncronize многопоточность не работает, и его всячески нужно избегать, применяя только при крайней необходимости. Если нужно что-то сказать главной форме, лучше брось ей сообщение через SendMessage.


 
Ketmar ©   (2006-10-27 01:07) [10]

>[8] Ingwar(c) 27-Oct-2006, 01:05
>ТО Ketmar: Ты как всегда рулишь... Коротко и ясно =)
ты, кажется, первый, кто так считает из начинающих. %-)


 
Anatoly Podgoretsky ©   (2006-10-27 01:08) [11]

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


 
Gero ©   (2006-10-27 01:08) [12]

> [10] Ketmar ©   (27.10.06 01:07)

Растет.


 
DrPass ©   (2006-10-27 01:09) [13]


> Ketmar ©   (27.10.06 01:07) [10]

Остальные обычно хотят тебя убить


 
Anatoly Podgoretsky ©   (2006-10-27 01:09) [14]


> Но там не написано, что при использовании Syncronize многопоточность
> не работает

Но здесь оно правильно применено, только для обновления, а не для выполнения работы в главном потоке.


 
Leonid Troyanovsky ©   (2006-10-27 01:10) [15]


> Ingwar ©   (27.10.06 00:58) [4]


type
 TForm1 = class(TForm)
   ..
 private
   { Private declarations }
   FX: Longint;
   procedure SetX(const Value: Longint); virtual;
 public
   { Public declarations }
   property X: Longint read FX write SetX;
 end;

procedure TForm1.SetX;
begin
 if Value <> FX then
   begin
     FX := Value;
     ShowMessage(IntToStr(FX)); // побочный эффект
   end;
end;

Т.е., при назначениях x := .. будет вызываться ShowMessage

--
Regards, LVT.


 
Ingwar ©   (2006-10-27 01:12) [16]

То Anatoly Podgoretsky: А со свойством как? Просто инетерсно... Мона примерчик или ссылку на литературу. Буду очень признателен =)


 
Ketmar ©   (2006-10-27 01:12) [17]

>[9] DrPass(c) 27-Oct-2006, 01:07
>лучше брось ей сообщение через SendMessage.
ты имел в виду PostMessage(), правда? %-)

>[13] DrPass(c) 27-Oct-2006, 01:09
>Остальные обычно хотят тебя убить
это ничего. обожаю негатив -- я ним питаюсь.

>[14] Anatoly Podgoretsky(c) 27-Oct-2006, 01:09
>Но здесь оно правильно применено, только для обновления, а
>не для выполнения работы в главном потоке.
и всё равно можно сделать PostMessage(). %-)


 
Ketmar ©   (2006-10-27 01:13) [18]

>[16] Ingwar(c) 27-Oct-2006, 01:12
см. [15]


 
DrPass ©   (2006-10-27 01:14) [19]


> Но здесь оно правильно применено, только для обновления,
>  а не для выполнения работы в главном потоке.

Сложно сказать... в данном потоке выполняется две крохотные инструкции сравнения 0.001% его времени работы и оставшиеся 99.999% - эта самая процедура переключения контекстов. Архангельский уснул бы удовлетворенным


 
DrPass ©   (2006-10-27 01:17) [20]


> ты имел в виду PostMessage(), правда? %-)

Я бы хотел иметь в виду PostMessage, но раз я уже написал SendMessage, автору теперь придется мучиться с зависанием приложения...


 
Ketmar ©   (2006-10-27 01:20) [21]

>[19] DrPass(c) 27-Oct-2006, 01:14
зато автор по ходу дела имеет шанс научиться работать с потоками и событиями. тоже полезно. а потом хлопнет себя по лбу, сделает свойство, и навсегда запомнит, как не надо решать проблемы. %-)


 
Ingwar ©   (2006-10-27 01:22) [22]

Спасибо за [15]! Первый раз вижу такую конструкцию... Сча буду разбирать как работает =)
Похоже спать мне сегодня не придется... стока всего инетерсного узнал!


 
Ketmar ©   (2006-10-27 01:25) [23]

>[22] Ingwar(c) 27-Oct-2006, 01:22
>Первый раз вижу такую конструкцию...
это потому, что язык не учил. %-)


 
Ingwar ©   (2006-10-27 01:35) [24]

Текс... А про PostMessage мона тоже немного просвятить?
И еще, если я правильно понял, что создание свойства позволяет избавится от потока. Или нет?

И еще возник вопрос. Тут сказали что при Syncronize не работает многопоточность. А работает ли многопоточность при обновлении данных на форме? Просто у меня толи доки не полные, толи я немного запутался.


 
Ketmar ©   (2006-10-27 01:40) [25]

>[24] Ingwar(c) 27-Oct-2006, 01:35
>Текс... А про PostMessage мона тоже немного просвятить?
оно тебе надо сейчас? осмысли пока то, что есть. %-)

>И еще, если я правильно понял, что создание свойства
>позволяет избавится от потока. Или нет?
в этом твоём конкретном случае -- да.

>И еще возник вопрос. Тут сказали что при Syncronize не
>работает многопоточность. А работает ли многопоточность
>при обновлении данных на форме?
а точнее? что есть "обновление данных на форме"?


 
Ingwar ©   (2006-10-27 01:42) [26]

То Ketmar: Ты прав... не учил... Я учусь на чужих исходниках разбираясь как оно работает, так повелось еще со спектрума...

И еще к тебе вопрос: Не посоветуешь где подробнее прочесть про CreateEvent... Просто я нашел всего один примерчик "отложенной операции чтения". А по Ф1 в D7 ничего не ищется =(


 
Ingwar ©   (2006-10-27 01:47) [27]

[25] Имелось ввиду обновления любых данных на форме, например:
Label1.Caption := "Чего-то там";
и т.д. Просто в моих доках про ничего толком про Syncronize не написано, кроме того что его надо использовать при выводе данных на форму. А тут я узнаю, что при Syncronize многопоточность "умирает". Вот и хотелось бы узнать эти вещи связаны как-то между собой или нет.


 
Ketmar ©   (2006-10-27 01:47) [28]

>[26] Ingwar(c) 27-Oct-2006, 01:42
всё интересное есть в MSDN. %-) в принципе, вполне достаточно, чтобы разобраться. коли ты привык "методом тыка", то особых сложностей быть не должно. главное -- читай внимательно.

а вообще -- сначала полезно почитать что-то по винде "в общем". и уровнем пониже Delphi. того же Петзольда, например. потом Фэнь Яня, Рихтера... потом придёшь сюда и будешь весело пинать новичков -- как мы. %-)


 
Ketmar ©   (2006-10-27 01:50) [29]

>[27] Ingwar(c) 27-Oct-2006, 01:47
ох... когда ты пишешь Synchronize(Update), то оно ждёт окончания Update. или любого другого метода, который ты передаёшь Synchronize(). натурально, если ты в теле метода делаешь код из [27], например, то поток ждёт в это время. проще говоря: рассматривай Synchronize(xxx) как вызов процедуры xxx(). пока эта процедура не отработает, поток выполняться не будет.


 
Ingwar ©   (2006-10-27 01:52) [30]

Пинать не есть хорошо... А вот направлять это более правильный подход. Если человека направить в нужную сторону, то он либо поймет, либо этот человек потерян для общества... Я обычно так проверяю =)
Единственная загвоздка при таком подходе правильно определить исходный уровень юнита, чтобы не дать ему сверхнепосильную задачу с которой он явно не справится.


 
Ketmar ©   (2006-10-27 01:56) [31]

>[30] Ingwar(c) 27-Oct-2006, 01:52
>Пинать не есть хорошо...
зато действенно. или полетит, или лопнет. лопнет -- фиг с ним, не повезло. возьмём следующего. %-)

если подумать: зачем нам конкуренты из молодёжи? %-)


 
Ingwar ©   (2006-10-27 02:22) [32]

Ketmar, вот ты такой умный. Не подскажешь ли как можно узнать сколько по времени выполняется фрагмент кода?


 
Ketmar ©   (2006-10-27 02:33) [33]

>[32] Ingwar(c) 27-Oct-2006, 02:22
>Ketmar, вот ты такой умный.
это тебе кто-то наврал.

>узнать сколько по времени выполняется фрагмент кода?
GetTickCount() до и после. или QueryPerformanceCounter() для более точного измерения. но всё равно latency будет -- винда многозадачная.

есть и другие методы, но я описывать не стану. рано ещё. %-)


 
Германн ©   (2006-10-27 02:35) [34]


> Ingwar ©   (27.10.06 02:22) [32]
>
> Ketmar, вот ты такой умный. Не подскажешь ли как можно узнать
> сколько по времени выполняется фрагмент кода?
>

GetTickCount поможет ОРД.



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

Форум: "Начинающим";
Текущий архив: 2006.11.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.049 c
3-1157979564
kaif
2006-09-11 16:59
2006.11.12
Как ограничить запрашиваемый SQL-набор в ADO


15-1161573842
Slider007
2006-10-23 07:24
2006.11.12
С днем рождения ! 21 октября


2-1161944511
RomanH
2006-10-27 14:21
2006.11.12
Опять эти MDI-окна


2-1161942939
term1t
2006-10-27 13:55
2006.11.12
statement too long


2-1161784739
remlin
2006-10-25 17:58
2006.11.12
Изменение размеров формы при потере фокуса





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