Форум: "Основная";
Текущий архив: 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