Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ProcessMessages [D6, D7, NT4, WinXP]


Страницы:   1 2 3 4 5

dmirror ©   (2006-10-31 14:08:00) 

В чистом приложении вызов Application.processmessages работает.
Создаю поток

type
TServiceThread = class(TThread)
 public
   procedure Execute; override;
 end;
---
var
 ServiceThread: TServiceThread;

и на processmessages компилятор начинает ругаться что не видит такой функции.

что может быть и как исправить?


Eraser   (2006-11-02 20:07:00) [1]

> [89] YuRock ©   (02.11.06 19:58)


> Ты написал, что Destroy вызывается из основного потока

вот это я и поправил, имелось ввиду OnTerminate.

> Это логика программ

логика программ в том, что TThread спроектирован для работы в разных потоках, а TApplication - нет.


YuRock   (2006-11-02 19:58:00) [2]


> ты с этим не соглсен?из всех правил есть исключения, но
> это не значит, что нужно игнорировать правила.


Это не правила. Это логика программ. При чем тут исключения из правил.


> согласен, в [84] я себя поправил.


Я другое имел ввиду. Ты написал, что Destroy вызывается из основного потока, а на самом деле его можно вызывать из какого-угодно.


Eraser   (2006-11-02 19:51:00) [3]

> [86] YuRock ©   (02.11.06 19:45)

согласен, в [84] я себя поправил.


Eraser   (2006-11-02 19:50:00) [4]

> [85] YuRock ©   (02.11.06 19:44)

пока что в заблуждение всех вводишь ты.

> Обращения ко всем переменные, использующиеся в разных потоках,
> обязательно надо синхронизировать, иначе буду AV, зависания
> и т.д.

ты с этим не соглсен?

из всех правил есть исключения, но это не значит, что нужно игнорировать правила.


YuRock   (2006-11-02 19:45:00) [5]


> Eraser ©   (02.11.06 19:39) [84]
> > метод Destroy выполняется в основном потокепоправочка
> OnTerminate, т.е. откуда возможен доступ к полям объекта.
>


Метод Destroy может выполняться в любомпотоке.


YuRock   (2006-11-02 19:44:00) [6]


> Eraser ©   (02.11.06 19:28) [83]


Ну так я его именно потому и выбрал :)
А свойство ThreadID, значит, нельзя использовать в коде потока?

Ладно с этим методом. Просто прозвучало утверждение: "Обращения ко всем переменные, использующиеся в разных потоках, обязательно надо синхронизировать, иначе буду AV, зависания и т.д.".

Ну хорошо. Синхронизируем. Перед использованием, скажем, некой переменной пишем:


 EnterCriticalSection( CS );
 //...


И получаем использование переменной CS (как минимум чтение) в разных потоках.

Так вот, меня интересует простой вопрос - зачем вводить в заблуждение читателей форума?


Eraser   (2006-11-02 19:39:00) [7]

> метод Destroy выполняется в основном потоке

поправочка OnTerminate, т.е. откуда возможен доступ к полям объекта.


Eraser   (2006-11-02 19:28:00) [8]

> [76] YuRock ©   (02.11.06 16:59)

где одновременноеиспользование?

> [82] YuRock ©   (02.11.06 17:34)


> Думаешь, размер FThreadID 1 байт?

метод Destroy выполняется в основном потоке, FThreadID устанавливается тоже в основном потоке. Свойство ThreadID только для чтения, так что никаких конфликтов быть не должно.
Да и, мягко говоря, не удачный ты класс для примера выбрал.. TThread специально спроектирован для работы с доп. потоками, поэтому тут узких мест быть не должно.


YuRock   (2006-11-02 17:34:00) [9]


> И какое же значение?


Не меньшее, чем SizeOf(Boolean)


> Не надо тут уже лепить про атомарность операций ввода/вывода
> рпо отношению к операндам размером в 1 байт.


Вот метод TThread.Destroy, который вызывается в другом потоке:
destructor TThread.Destroy;
begin
 if (FThreadID <> 0) and not FFinished then
 begin
   Terminate;
...
end;


Думаешь, размер FThreadID 1 байт?


> Облажаешься - не отмоешься.


Это не всегда и не по всем заметно... почему-то...


Сергей М.   (2006-11-02 17:19:00) [10]


> YuRock ©   (02.11.06 17:09) [79]


Не надо тут уже лепить про атомарность операций ввода/вывода рпо отношению к операндам размером в 1 байт.

Сто раз обсуждалось.

Облажаешься - не отмоешься.


BiN   (2006-11-02 17:15:00) [11]


> YuRock ©   (02.11.06 17:09) [79]
>
>
> Не только. TThread.FSynchronizeException еще очень большое
> значение имеет в этом контексте...

И какое же значение?


YuRock   (2006-11-02 17:09:00) [12]


> Все дело в SizeOf(FTerminated).


Не только. TThread.FSynchronizeException еще очень большое значение имеет в этом контексте...


Сергей М.   (2006-11-02 17:05:00) [13]


> YuRock ©   (02.11.06 16:59) [76]


Байка о бузине и дядьке.

Диагноз - "В сад" (С)


BiN   (2006-11-02 17:04:00) [14]


> YuRock ©   (02.11.06 16:59) [76]
>
> Переменную класса TThread.FTerminated
> присваиваете в одном потоке, а используете - в другом...
>  Безо всяких CS. И это - общепринятый метод - когда можно
> - использовать такое. Одновременно :)
>

Все дело в SizeOf(FTerminated).

скучно...


YuRock   (2006-11-02 16:59:00) [15]


> не используем.


Мда? А никогда не приходилось в TThread.Execute делать такой цикл:


while not Terminated do begin
 //...
end;


а при закрытии приложения, чтобы корректно завершить работу этого потока вызвать, например, Thead1.Terminateили Thead1.Free, который тоже вызовет Terminate?

Если приходилось (а такого не могло не случиться :) ), то да, используете... Переменную класса TThread.FTerminated присваиваете в одном потоке, а используете - в другом... Безо всяких CS. И это - общепринятый метод - когда можно - использовать такое. Одновременно:)


Сергей М.   (2006-11-02 16:49:00) [16]


> YuRock ©   (02.11.06 16:30) [72]


> Ребята, зачем вы чушь несете?


Затем чтобы никому не было повадно использовать сабж в своих многопоточных разработках при использовании VCL.

Get/Peek/WaitMessage упразднены уже, а ?


Eraser   (2006-11-02 16:49:00) [17]

> [72] YuRock ©   (02.11.06 16:30)


> Если да - то вы ОБЯЗАТЕЛЬНО ОДНОВРЕМЕННО используете один
> объект в разных потоках!

не используем.


BiN   (2006-11-02 16:36:00) [18]

Application.ProcessMessages в дополнительном потоке - всё равно что трусы на голове - носить можно, но глупо и чревато менингитом с летальным исходом.


YuRock   (2006-11-02 16:30:00) [19]


> Eraser ©   (02.11.06 16:13) [70]
> его нельзя использовать в обоих потоках одновременно.



> Сергей М. ©   (02.11.06 16:13) [71]
> Репу почесав - можно.И оную же почесав - нельзя.


Ребята, зачем вы чушь несете? Вас же вообще ничего незнающие люди читают и верят!!!

Вы пользуетесь компонентами типа Indy, IBX... Да просто классом TThread? Если да - то вы ОБЯЗАТЕЛЬНО ОДНОВРЕМЕННОиспользуете один объект в разных потоках!


Сергей М.   (2006-11-02 16:13:00) [20]


> если объект создан в потоке X, то в потоке Y его использовать
> нельзя. Так?


Репу почесав - можно.
И оную же почесав - нельзя.
Репа программеру дана не только для пожирания чего-то там)


Страницы:   1 2 3 4 5

Наверх

Титульная страница Поиск, карта сайта Написать письмо