Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2010, 22:39   #1
Шульц
Форумчанин
 
Регистрация: 14.09.2008
Сообщений: 172
По умолчанию Использование глобальной переменной в потоке

Как можно использовать глобальную переменную формы в потоке. Если можно расскажите поподробней, или направте ан статьи, только понятные. И примеры, очень надо примеры
Шипулин А. В.
Шульц вне форума Ответить с цитированием
Старый 16.03.2010, 23:22   #2
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Пропиши переменную в Public и используй её в потоке.
FaTaL вне форума Ответить с цитированием
Старый 17.03.2010, 01:26   #3
notHaker
Форумчанин
 
Аватар для notHaker
 
Регистрация: 01.12.2009
Сообщений: 569
По умолчанию

В потоке? имеется ввиду Thread? Если да, то там имеются подводные камни, иначе солидарен с FaTaL
Код - это работа, а работа стоит денег.

pz-game.ru. 2d зомби-сурвивал для олдфагов.
notHaker вне форума Ответить с цитированием
Старый 17.03.2010, 07:47   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Примеры? Их есть у меня:
Работа с формой из потока
Вот главная форма
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses unit2;
var t:TMyThread;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 t:=TMyThread.Create(true);
 t.f:=self;// в поток передается переменная
 t.FreeOnTerminate:=true;
 t.Resume;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 t.Terminate;
end;

end.
Вот реализация потока:
Код:
unit Unit2;

interface

uses   unit1, SysUtils,
  Classes;

type
  TMyThread = class(TThread)
  public
   f:TForm1;
  private
    { Private declarations }
  protected
  procedure UpdateCaption;
    procedure Execute; override;
  end;

implementation

{ Important: Methods and properties of objects in VCL or CLX can only be used
  in a method called using Synchronize, for example,

      Synchronize(UpdateCaption);

  and UpdateCaption could look like,


{ TMyThread }

    procedure TMyThread.UpdateCaption;
    begin
      F.Caption := TimeToStr(now);
    end;
procedure TMyThread.Execute;
begin

 while not self.Terminated do
  Synchronize(UpdateCaption);
end;

end.
Выделенное - пример изменения потоком некого свойства формы, с синхронизацией
В данном случае тупо выводится время в заголовок
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.03.2010, 08:39   #5
Шульц
Форумчанин
 
Регистрация: 14.09.2008
Сообщений: 172
По умолчанию

notHaker, да я имел в виду Thread.
Stilet, а если вместо свойства формы нужно просто переменную? То ее тоже просто в public обьявить?
Шипулин А. В.
Шульц вне форума Ответить с цитированием
Старый 17.03.2010, 11:08   #6
notHaker
Форумчанин
 
Аватар для notHaker
 
Регистрация: 01.12.2009
Сообщений: 569
По умолчанию

Шульц, да. но она глобальна и к ней будут имет доступ и проц и поток. Поэтому надо синхронизировать работу проца и потока с этой переменной. Здесь это наверное нужно сделать просто из-за правила хорошего тона, тк очень мала вероятность одновренного чтения процом (или потоком) этой переменной и записи потоком. Ну а вообще если там будет массив или что нибудь исчо, то это нужно делать обязательно.
Код - это работа, а работа стоит денег.

pz-game.ru. 2d зомби-сурвивал для олдфагов.
notHaker вне форума Ответить с цитированием
Старый 17.03.2010, 19:47   #7
Шульц
Форумчанин
 
Регистрация: 14.09.2008
Сообщений: 172
По умолчанию

То есть я обьявлю ее в Public потока, как например S:String, и просто в Var формы, и будет работать? А не будет ли считатся что это разные переменные?
Шипулин А. В.
Шульц вне форума Ответить с цитированием
Старый 18.03.2010, 00:39   #8
notHaker
Форумчанин
 
Аватар для notHaker
 
Регистрация: 01.12.2009
Сообщений: 569
По умолчанию

Да блин. Вот глобальная переменная...
Код:
interface

uses
...

var
  MyGlobalVar: Integer;

implementation
...
Код - это работа, а работа стоит денег.

pz-game.ru. 2d зомби-сурвивал для олдфагов.
notHaker вне форума Ответить с цитированием
Старый 18.03.2010, 14:13   #9
IliaIT
Форумчанин
 
Аватар для IliaIT
 
Регистрация: 17.03.2009
Сообщений: 977
По умолчанию

Тоже долго пытался понять как правильно сделать данный момент, в итоге создал глобальную переменную как показал notHaker, но для записи в неё из потока создавал отдельную процедуру (mySin) и вызывал в нужном месте потока с помощью Synchronize(mySin);
Интуитивно понятный интерфейс - это такой интерфейс, для работы с которым нужна недюжинная интуиция.
IliaIT вне форума Ответить с цитированием
Старый 18.03.2010, 16:18   #10
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Цитата:
тк очень мала вероятность одновренного чтения процом (или потоком) этой переменной и записи потоком
Если есть отличная от нуля вероятность того, что её попытаются изменить 2 потока одновременно - они это рано или поздно сделают (закон Мура: если что-то плохое может произойти, оно обязательно произойдёт ) и может получится AV на ровном месте. Для таких случаев предусмотрен механизм критических секций, в делфи он завёрнут в клвсс TCriticalSection

Код:
  uses ..., SyncObjs;

  CS: TCriticalSection;
  CS := TCriticalSection.Create;
   
  ...

  //Везде, где происходит обращение к переменной
  CS.Enter;
  //обязательно Try...Finally!
  try
    <всё, что находится в критической секции, до выхода из неё недоступно другим потокам> 
  finally
    CS.Leave;
  end;

  ...

  CS.Free;
Метод Synchronize, собственно, делает то же самое, но там ещё event'ы, сигналы главному потоку... т.е. заточен он именно под общение с VCL и достаточно тормозной, так что использовать его для потокобезопасного доступа к переменным - как стрелять из пушки по воробьям
пыщь

Последний раз редактировалось JTG; 18.03.2010 в 16:23.
JTG вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Смена глобальной переменной другой программы W0LF Помощь студентам 5 01.02.2010 09:03
Многопоточность с глобальной переменной Шульц Общие вопросы Delphi 1 30.01.2010 18:19
Объявление глобальной переменной Grom48 Общие вопросы Delphi 3 19.12.2009 22:16
Проблема глобальной переменной Хохматый Microsoft Office Access 1 18.06.2009 13:04
Как обратится к глобальной переменной из модуля tavrocotaps Общие вопросы Delphi 2 10.06.2009 11:08