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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.12.2012, 11:18   #1
_ZixeL_
Форумчанин
 
Регистрация: 04.11.2012
Сообщений: 151
По умолчанию Поток

Добрый день, формучане!
Я в делфи всё еще новичок. Никак не получается процедуру влепить в отдельный поток.

Собственно.



Код:
  potok = class(TThread)
  private
  protected
    FNextConnectionRow: Integer;
    procedure Execute; override;
  public
    constructor Create(CreateSuspended: Boolean);
  end;

Код:
constructor potok.Create(CreateSuspended: Boolean);
begin
  inherited Create(CreateSuspended);
end;
Дальше пытаюсь старую процедуру вставить в поток. Делаю так:

Код:
procedure potok.Execute;
var
j:integer;
  tab: TTabSheet;
  rdp: TMsRdpClient6;
  state, anyselected: boolean;
  other:string;
begin
AnySelected := false;
 while (FNextConnectionRow > 0) and
    (FNextConnectionRow < Form1.AdvStringGrid1.RowCount-1) and
    (Form1.PageControl2.PageCount < Form1.SpinEdit1.Value) do
  begin

    if Flag=1 then Break;
    i := FNextConnectionRow+1;
    Inc(FNextConnectionRow);
    if Form1.AdvStringGrid1.GetCheckboxState(0, i, state) = state then
    begin
    AnySelected := true;
    tab := TTabSheet.Create(Form1.PageControl2);
    tab.Parent := Form1.PageControl2;
    tab.Name := 'tab' + inttostr(i);
    tab.Caption := Form1.AdvStringGrid1.Cells[3, i];
    tab.Visible := true;
    tab.PageControl := Form1.PageControl2;
    tab.Tag := i;

    rdp := TMsRdpClient6.Create(tab);
    rdp.Name := 'rdp' + IntToStr(i);
    rdp.Parent := tab;
    rdp.Left := 10;
    rdp.Top := 10;
    rdp.Width := 973;
    rdp.Height := 431;
    rdp.ConnectingText := 'Подключение к серверу: ' + Form1.AdvStringGrid1.Cells[3, i];
    rdp.OnConnected := OnConnected;
    rdp.OnLoginComplete := OnLoginComplete;
    rdp.OnLogonError := OnLogonError;
    rdp.OnDisconnected := OnDisconnected;
    rdp.OnConnecting := OnConnecting;
    rdp.Tag := i;
    rdp.AdvancedSettings2.singleConnectionTimeout:=strtoint(Form1.Edit6.Text);

    if Form1.checkbox3.Checked then
    begin
    rdp.AdvancedSettings2.RedirectDrives:=true;
    rdp.SecuredSettings.StartProgram:='\\tsclient\'+Form1.Edit7.Text+Form1.Edit8.Text;
    end
    else
    rdp.AdvancedSettings2.RedirectDrives:=false;

    rdp.Server := Form1.AdvStringGrid1.Cells[3, i];
    rdp.UserName := Form1.AdvStringGrid1.Cells[4, i];
    rdp.AdvancedSettings2.ClearTextPassword := Form1.AdvStringGrid1.Cells[5, i];
    rdp.Connect;

    end;
  end;

end;
Вызываю всё это дело кнопкой:

Код:
procedure TForm1.Button3Click(Sender: TObject);
begin
potok.Create(false);
end;
Но, никакой реакции по нажатию кнопки. Даже вкладки не создаются.
Что я не так делаю?
Вопрос глупый, знаю.Каюсь, стыдно)

Спасибо заранее всем.
_ZixeL_ вне форума Ответить с цитированием
Старый 19.12.2012, 18:06   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

1.
Цитата:
while (FNextConnectionRow > 0) and
а чему равно FNextConnectionRow в начале?
подозреваю =0 => while false => ?!

а теперь общие замечания.
Работа с VCL (формы и все что есть на них) внутри потока мягко говоря не приветствуется.
Она конечно допустима, но требует synchronize что равносильно остановке потока до окончания данной операции (до выполнения ВСЕХ действий внутри процедуры).
Теперь убираем (или комментируем) из вашей Execute все связанное с Form и что там останется? Может быть вам все-таки обойтись без потока?

как работать с потоками
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 19.12.2012 в 18:09.
evg_m вне форума Ответить с цитированием
Старый 19.12.2012, 18:22   #3
_ZixeL_
Форумчанин
 
Регистрация: 04.11.2012
Сообщений: 151
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
1.

а чему равно FNextConnectionRow в начале?
подозреваю =0 => while false => ?!

а теперь общие замечания.
Работа с VCL (формы и все что есть на них) внутри потока мягко говоря не приветствуется.
Она конечно допустима, но требует synchronize что равносильно остановке потока до окончания данной операции (до выполнения ВСЕХ действий внутри процедуры).
Теперь убираем (или комментируем) из вашей Execute все связанное с Form и что там останется? Может быть вам все-таки обойтись без потока?

как работать с потоками
Спасибо за ответ.

Изначально FNextConnectionRow := 1;

без потока, раньше запускал цикл так

Код:
procedure TForm1.Button3Click(Sender: TObject);
begin
flag:=0;
if radiobutton1.Checked=true then
begin
CheckBox1.Checked := True;
  FNextConnectionRow := 1;
  AddConnections;
  end
  else
  FNextConnectionRow := 1;
  AddConnections;
end;
Где AddConnections - та самая процедура, что писал в первом посте.

Спасибо за ссылку, уже был на ней. Но всё никак нет времени вчитаться в статью. А по быстрому не понимается


Возможно Вы правы. в основном потоке оно работает нормально. Но, меня сильно смущает мерцание компонентов во время выполнения цикла, и небольшое подвисание программы. То я подумал, что отдельный поток решит данную проблему.
К сожалению, даже DoubleBuffered=true не помогает.
Возможно подскажете как решить проблему с мерцанием?

Спасибо.
_ZixeL_ вне форума Ответить с цитированием
Старый 19.12.2012, 20:19   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Изначально FNextConnectionRow := 1;
Где в какой строчке кода есть такое?

Цитата:
Дальше пытаюсь старую процедуру вставить в поток. Делаю так:
А используете НОВУЮ переменную!
Код:
 potok = class(TThread)
  private
  protected
    FNextConnectionRow: Integer;
    procedure Execute; override;
  public
    constructor Create(CreateSuspended: Boolean);
  end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 19.12.2012, 21:59   #5
_ZixeL_
Форумчанин
 
Регистрация: 04.11.2012
Сообщений: 151
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Где в какой строчке кода есть такое?



А используете НОВУЮ переменную!
Код:
 potok = class(TThread)
  private
  protected
    FNextConnectionRow: Integer;
    procedure Execute; override;
  public
    constructor Create(CreateSuspended: Boolean);
  end;
Да, это я уже понял
Но почему-то создаётся всего одна вкладка. Без нового окна rdp.
_ZixeL_ вне форума Ответить с цитированием
Старый 19.12.2012, 22:52   #6
xoodoo
Форумчанин
 
Регистрация: 11.04.2012
Сообщений: 212
По умолчанию

TMsRdpClient6 работает в неблокирующем режиме с асинхронными нотификациями о событиях.
Потоки в данной задаче вообще не нужны.
xoodoo вне форума Ответить с цитированием
Старый 20.12.2012, 07:45   #7
_ZixeL_
Форумчанин
 
Регистрация: 04.11.2012
Сообщений: 151
По умолчанию

Цитата:
Сообщение от xoodoo Посмотреть сообщение
TMsRdpClient6 работает в неблокирующем режиме с асинхронными нотификациями о событиях.
Потоки в данной задаче вообще не нужны.
Спасибо. Как тогда решить проблему с мерцанием компонентов? Подскажите пожалуйста.
_ZixeL_ вне форума Ответить с цитированием
Старый 20.12.2012, 09:08   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Как тогда решить проблему с мерцанием компонентов? Подскажите пожалуйста.
Код:
DoubleBuffered:=true;
подробности наверняка есть на форуме
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 20.12.2012, 09:23   #9
_ZixeL_
Форумчанин
 
Регистрация: 04.11.2012
Сообщений: 151
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
DoubleBuffered:=true;
подробности наверняка есть на форуме
Спасибо. Но я писал выше, что это не помогает.
У меня эта процедура выполняется каждый раз, после закрытия одной вкладки. Тогда процедура создаёт новую вкладку и рдп окно. Вот тогда и начинают мерцать компоненты.
_ZixeL_ вне форума Ответить с цитированием
Старый 20.12.2012, 10:05   #10
xoodoo
Форумчанин
 
Регистрация: 11.04.2012
Сообщений: 212
По умолчанию

Свойство DoubleBuffered никаким боком не касается компонентов-наследников TWinControl, лежащих непосредственно на форме либо на WinControl-контейнерах на ней - оно влияет только на работу компонентов-наследников TGraphicControl.
xoodoo вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Класс запускает поток, который заполняет этот класс. Обмен класс <=> поток. Человек_Борща Общие вопросы Delphi 8 27.02.2012 23:24
Поток. Не получается создать поток. Выдает ошибки при запуске bigory Общие вопросы по Java, Java SE, Kotlin 3 23.09.2010 00:40
поток Артэс Общие вопросы C/C++ 9 08.07.2010 12:12
Поток в Си shapiro Помощь студентам 1 18.04.2010 23:01
Поток Черничный Общие вопросы Delphi 5 27.09.2008 21:23