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

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.009 c
14-39052
blackman
2004-01-25 10:55
2004.02.13
Михалков приходит, как хозяин…


14-39040
able
2004-01-25 18:12
2004.02.13
PHP + Apache


1-38915
Mitrofan
2004-02-04 14:16
2004.02.13
Не печатается отчет


1-38943
killer
2004-01-23 13:37
2004.02.13
Scroll в Memo


1-38839
AMogil
2004-02-02 18:02
2004.02.13
Неправильная кодировка в программе при запуске английском Window





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