![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ProcessMessages [D6, D7, NT4, WinXP]
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 его использовать
> нельзя. Так?
Репу почесав - можно.
И оную же почесав - нельзя.
Репа программеру дана не только для пожирания чего-то там)