Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.13;
Скачать: CL | DM;

Вниз

Thread и потокобезопасность   Найти похожие ветки 

 
Amigos   (2004-02-02 11:32) [0]

Скажити гуру, верно ли что все VCL компоненты потоконебезопасны. Или только те у которых есть Handle?


 
CMeX ©   (2004-02-02 11:36) [1]

Вообще-товизуальные компоненты в потокахне работают... Они всегда в главном потокедолжныбыть => делай выводы ;)


 
Amigos   (2004-02-02 11:44) [2]

>CMeX
т.е. че, я не могу создать форму в потоке и выводить на нее чего-нить? скажем менять заголовок?


 
Sergey_Masloff   (2004-02-02 11:51) [3]

Почти вся VCL НЕПОТОКОБЕЗОПАСНА.

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


 
Digitman ©   (2004-02-02 11:51) [4]


> Amigos (02.02.04 11:44) [2]



> че, я не могу создать форму в потоке и выводить на нее чего-нить?


а зачем ? все это прекрасно делается и в осн.код.потоке !


 
Anatoly Podgoretsky ©   (2004-02-02 11:56) [5]

НЕПОТОКОБЕЗОПАСНЫ не только VCL но все глобальные, общии объекты, читай переменные. Например не потоко безопасна следующая операция A := A + 1, если не принять мер по защите.


 
Amigos   (2004-02-02 12:09) [6]

>Digitman
OK. Подробнее. Может я в корне ошибаюсь. Мне нужно обрабатывать данные из DataSet. Причем можно несколько "обработчиков" с разными данными запустить.


 
Amigos   (2004-02-02 12:11) [7]

>Anatoly Podgoretsky
Что значит "мер по защите"?


 
Anatoly Podgoretsky ©   (2004-02-02 12:15) [8]

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

Простой пример, приход или расход со склада. Было 5 единиц, два менеджера почти одновременно сделали расход на 1, должно остаться 3 если это делается поочередно, но первый и второй менеджер прочитали пять и отняли от него по единицы, в результате получилось 4, вместо 3. Операция A := A - 1 не атомарна.

И так с любыми переменными, к которым имеет доступ поток.


 
Amigos   (2004-02-02 12:18) [9]

Ну а если не нужно читать данные?
Т.е. если я в потоке создаю DataSet и только из этого же потока "стучусь" к этим данным и обрабатываю их? Это нормально?


 
Sergey_Masloff   (2004-02-02 12:23) [10]

Amigos (02.02.04 12:18) [9]
Нормально-то оно нормально да только датасет у тебя не в пустоте же. Использует он соединение. Так что если соединение в потоке создашь - тогда можно.


 
Digitman ©   (2004-02-02 12:24) [11]


> Amigos (02.02.04 12:09) [6]


для начала поясни, при чем здесь форма ?

объект TDataSet прекрасно обходится без наличия оной в проекте


 
Amigos   (2004-02-02 12:28) [12]

:-) Просто некто СмеХ ответил:
Вообще-то визуальные компоненты в потоках не работают... Они всегда в главном потокедолжныбыть => делай выводы
Вот я форму и приплел...


 
Sandman25 ©   (2004-02-02 12:30) [13]

[12] Amigos (02.02.04 12:28)

TDataSet не визуальный компонент.


 
Amigos   (2004-02-02 12:38) [14]

>Sandman25
:-) Спасибо, ГУРУ!!! :-))) Очень важное замечание :-)))


 
CMeX ©   (2004-02-02 12:48) [15]

Amigos (02.02.04 11:44) [2]

>>CMeX
>т.е. че, я не могу создать форму в потоке и выводить на нее >чего-нить? скажем менять заголовок?

Из потоков можно посылать сообщения, а реально (напрямую) с формой работать из дочернего потока нельзя.


 
Digitman ©   (2004-02-02 12:51) [16]


> Amigos (02.02.04 12:38) [14]


> Очень важное замечание


но к "делу о потокобезопасности" объекта-наследника данного класса это никоим образом не относится


 
Sandman25 ©   (2004-02-02 13:02) [17]

Мое важное замечание приводилось в защиту утверждения by СмеХ о том, что нет смысла создавать TButton и другие визуальные компоненты не в основном потоке. Соответственно, Amigos неверно истолковал полученную информацию, посчитав, что если объект (или его наследник) находится на палитре компонентов, то он визуальный и утверждение by СмеХ к нему относится.

ЗЫ. За ГУРУ спасибо, позабавили :)


 
Amigos   (2004-02-02 17:48) [18]

>CMeX
Что значит нельзя??? Можно, но это неправильно - другое дело! А то нельзя!


 
Sergey_Masloff   (2004-02-02 18:20) [19]

конечно можно. Но... аккуратно. А так-пожалуйста (это не в коем случае не пример аккуратности - просто показывает что таи можно)

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TThreadForm = class(TThread)
protected
procedure Execute; override;
end;

TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TThreadForm.Execute;
begin
with TForm.Create(nil) do
try
Caption := "Hello from thread";
ShowModal();
finally
Free();
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
with TThreadForm.Create(true) do
begin
FreeOnTerminate := True;
Resume();
end;
end;

end.


 
Amigos   (2004-02-02 19:58) [20]

>Sergey_Masloff
Спасибо еще раз! Спасибо всем.



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

Текущий архив: 2004.02.13;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.035 c
1-38779
AlexeyITN
2004-02-03 16:04
2004.02.13
ProgressBar1 и TThread


1-38955
10100010110110110001
2004-02-03 22:47
2004.02.13
ТЕКСТ


14-39048
RealRascal
2004-01-24 12:33
2004.02.13
Алгоритм


9-38664
S_c_o_R_p
2003-08-03 17:24
2004.02.13
GlScene


1-38856
IgorRu
2004-02-02 10:44
2004.02.13
Загрузка форм из DLL.