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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.02.2017, 15:43   #1
Djavol
Пользователь
 
Регистрация: 17.04.2016
Сообщений: 18
По умолчанию ПОТОКИ!!!! Synchronize

Мне нужно засунуть FResultList.Add(FormatDateTime('dd. mm.yyyy ddd',t)); в синхронайз, правильно ли сделал или как правильно?

Код:
type
  TMyPotok = class(TThread)
  private
  FT1: Integer;
  FT2: Integer;
  FResultList: TStrings;
  protected
  procedure Execute; override;
  destructor Destroy; override;
  procedure UpdateListBox;
  public
  constructor Create(T1, T2: integer; ResultList: TStrings); virtual;
  end;
   procedure TMyPotok.UpdateListBox;
var t:integer;
begin
    FResultList.Add(FormatDateTime('dd.mm.yyyy ddd',t));
end;


procedure TMyPotok.Execute;
var t:integer;
    Year,Month,Day,dn:Word;
begin
    Form1.ListBox1.Clear;
    For t:=Ft1 to Ft2 do
    begin
      DecodeDate(t,Year,Month,Day);
      dn:=DayOfWeek(t);
     If (dn=6) and (Day=13) then
     FResultList.Add(FormatDateTime('dd.mm.yyyy ddd',t));
     //Synchronize(UpdateListBox);
    end;
  Synchronize(UpdateListBox);
end;
//Synchronize(UpdateListBox);
end.
Djavol вне форума Ответить с цитированием
Старый 02.02.2017, 15:58   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

нет.
Код:
begin
    Form1.ListBox1.Clear; //проводить это лучше в главной форме ДО запуска потока
или тоже "обертывать"  в процедуру ClearList аналогочную UpdateList (да и использовать внутри не Form1...  
 а все тот же ResultList) и применять Synchronize(ClearList);
....
     If (dn=6) and (Day=13) then
     FResultList.Add(FormatDateTime('dd.mm.yyyy ddd',t)); //вы ПРОДОЛЖАЕТЕ использовать не ваши объекты БЕЗ синхронизации
     //Synchronize(UpdateListBox); // а вот так было бы правильно.
    end;
  Synchronize(UpdateListBox); // ну формально оно правильно, но немного бесполезно, при учете предыдущего замечания.
разве что мы захотим "индикацию" что все мы проверили и поток идет гуд-бай. но тогда 
по аналогии с ClearList  Synchronize(FinishList);
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 02.02.2017 в 16:03.
evg_m вне форума Ответить с цитированием
Старый 02.02.2017, 16:49   #3
Djavol
Пользователь
 
Регистрация: 17.04.2016
Сообщений: 18
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
нет.
Код:
begin
    Form1.ListBox1.Clear; //проводить это лучше в главной форме ДО запуска потока
или тоже "обертывать"  в процедуру ClearList аналогочную UpdateList (да и использовать внутри не Form1...  
 а все тот же ResultList) и применять Synchronize(ClearList);
....
     If (dn=6) and (Day=13) then
     FResultList.Add(FormatDateTime('dd.mm.yyyy ddd',t)); //вы ПРОДОЛЖАЕТЕ использовать не ваши объекты БЕЗ синхронизации
     //Synchronize(UpdateListBox); // а вот так было бы правильно.
    end;
  Synchronize(UpdateListBox); // ну формально оно правильно, но немного бесполезно, при учете предыдущего замечания.
разве что мы захотим "индикацию" что все мы проверили и поток идет гуд-бай. но тогда 
по аналогии с ClearList  Synchronize(FinishList);
Код:
procedure TMyPotok.UpdateListBox;
var t:integer;
begin
    FResultList.Add(FormatDateTime('dd.mm.yyyy ddd',t));
end;


procedure TMyPotok.Execute;
var t:integer;
    Year,Month,Day,dn:Word;
begin
    //Form1.ListBox1.Clear;
    For t:=Ft1 to Ft2 do
    begin
      DecodeDate(t,Year,Month,Day);
      dn:=DayOfWeek(t);
     If (dn=6) and (Day=13) then
     //FResultList.Add(FormatDateTime('dd.mm.yyyy ddd',t));
     Synchronize(UpdateListBox);
    end;
  //Synchronize(UpdateListBox);
end;
//Synchronize(UpdateListBox);
end.
так?? Если нет, то напишите пожалуйста все таки полностью как надо
Djavol вне форума Ответить с цитированием
Старый 02.02.2017, 17:35   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

если НИГДЕ нет обращений к ВНЕШНИМ объектам без Synchronize то общение с "внешним" миром построено правильно.
OFFTOP. если конечно же в качестве синхронизации используется только он. это замечание для "гуру".

так что на беглый взгляд, такой же как и в прошлый раз (что увидел, то и сказал в комментариях), то все нормально.
В "начинку" цикла(алгоритм вычислений) не вникал даже бегло.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 02.02.2017, 20:52   #5
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Ну тогда вот так если такой путь избрали

Код:

Код:
type
MyClass= class(TThread)
FResultStr: string; объявите в классе потока в место FResultList
............................


procedure MyClass.UpdateListBox;
begin
 Form1.Listbox1.Items.add(FResultStr);
end;

procedure MyClass.Execute;
var t, t1, t2:integer;
    Year,Month,Day,dn:Word;
begin
   t1:=Trunc(form1.DateTimePicker1.Time);
   t2:=Trunc(form1.DateTimePicker2.time);
     For t:=Ft1 to Ft2 do
     begin
      DecodeDate(t,Year,Month,Day);
      dn:=DayOfWeek(t);
    If (dn=6) and (Day=13) then
    begin
     FResultStr:= FormatDateTime('dd.mm.yyyy ddd',t);
     synchronize(UpdateListBox);
    end;
    end;
end;

end.
в общем надеюсь вы поняли что передаем через новую переменную FResultStr она синхронно передается уже листу, можете применить и в моем коде что я писал в другом посте либо в вашем.

в моем будет так
Код:
type
  TMyPotok = class(TThread)
  private
  FT1: Integer;
  FT2: Integer;
  FResultList: TStrings;
  FResultStr: string; 
  protected
  procedure Execute; override;
  destructor Destroy; override;
  procedure UpdateListBox; virtual;
  public
  constructor Create(T1, T2: integer; ResultList: TStrings); virtual;
  end;

procedure TMyPotok.UpdateListBox;
var t:integer;
begin
    FResultList.Add(FormatDateTime('dd.mm.yyyy ddd',t));
end;

procedure TMyPotok.Execute;
var t:integer;
    Year,Month,Day,dn:Word;
begin
FResultList.clear; //если нужно но это вы можете делать при создании потока в Unit1
     For t:=Ft1 to Ft2 do
     begin
      DecodeDate(t,Year,Month,Day);
      dn:=DayOfWeek(t);
    If (dn=6) and (Day=13) then
    begin
     FResultStr:= FormatDateTime('dd.mm.yyyy ddd',t);
     synchronize(UpdateListBox);
    end;
    end;
end;

end.

Последний раз редактировалось Aliens_wolfs; 02.02.2017 в 21:05.
Aliens_wolfs вне форума Ответить с цитированием
Старый 02.02.2017, 20:58   #6
Djavol
Пользователь
 
Регистрация: 17.04.2016
Сообщений: 18
По умолчанию

Цитата:
Сообщение от Aliens_wolfs Посмотреть сообщение
Ну тогда вот так если такой путь избрали

Код:

Код:
type
MyClass= class(TThread)
FResultStr: string; объявите в классе потока в место FResultList
............................


procedure MyClass.UpdateListBox;
begin
 Form1.Listbox1.Items.add(FResultStr);
end;

procedure MyClass.Execute;
var t, t1, t2:integer;
    Year,Month,Day,dn:Word;
begin
   t1:=Trunc(form1.DateTimePicker1.Time);
   t2:=Trunc(form1.DateTimePicker2.time);
     For t:=Ft1 to Ft2 do
     begin
      DecodeDate(t,Year,Month,Day);
      dn:=DayOfWeek(t);
    If (dn=6) and (Day=13) then
    begin
     FResultStr:= FormatDateTime('dd.mm.yyyy ddd',t);
     synchronize(UpdateListBox);
    end;
    end;
end;

end.


в общем надеюсь вы поняли что передаем через новую переменную FResultStr она синхронно передается уже листу, можете применить и в моем коде это либо в вашем
http://www.programmersforum.ru/showt...=1#post1661995
Djavol вне форума Ответить с цитированием
Старый 02.02.2017, 21:08   #7
Djavol
Пользователь
 
Регистрация: 17.04.2016
Сообщений: 18
По умолчанию

Цитата:
Сообщение от Aliens_wolfs Посмотреть сообщение
Ну тогда вот так если такой путь избрали

Код:

Код:
type
MyClass= class(TThread)
FResultStr: string; объявите в классе потока в место FResultList
............................


procedure MyClass.UpdateListBox;
begin
 Form1.Listbox1.Items.add(FResultStr);
end;

procedure MyClass.Execute;
var t, t1, t2:integer;
    Year,Month,Day,dn:Word;
begin
   t1:=Trunc(form1.DateTimePicker1.Time);
   t2:=Trunc(form1.DateTimePicker2.time);
     For t:=Ft1 to Ft2 do
     begin
      DecodeDate(t,Year,Month,Day);
      dn:=DayOfWeek(t);
    If (dn=6) and (Day=13) then
    begin
     FResultStr:= FormatDateTime('dd.mm.yyyy ddd',t);
     synchronize(UpdateListBox);
    end;
    end;
end;

end.
в общем надеюсь вы поняли что передаем через новую переменную FResultStr она синхронно передается уже листу, можете применить и в моем коде что я писал в другом посте либо в вашем.

в моем будет так
Код:
type
  TMyPotok = class(TThread)
  private
  FT1: Integer;
  FT2: Integer;
  FResultList: TStrings;
  FResultStr: string; 
  protected
  procedure Execute; override;
  destructor Destroy; override;
  procedure UpdateListBox; virtual;
  public
  constructor Create(T1, T2: integer; ResultList: TStrings); virtual;
  end;

procedure TMyPotok.UpdateListBox;
var t:integer;
begin
    FResultList.Add(FormatDateTime('dd.mm.yyyy ddd',t));
end;

procedure TMyPotok.Execute;
var t:integer;
    Year,Month,Day,dn:Word;
begin
FResultList.clear; //если нужно но это вы можете делать при создании потока в Unit1
     For t:=Ft1 to Ft2 do
     begin
      DecodeDate(t,Year,Month,Day);
      dn:=DayOfWeek(t);
    If (dn=6) and (Day=13) then
    begin
     FResultStr:= FormatDateTime('dd.mm.yyyy ddd',t);
     synchronize(UpdateListBox);
    end;
    end;
end;

end.
unit Unit2; //ìîåååååååå

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TMyPotok = class(TThread)
private
FT1: Integer;
FT2: Integer;
FResultStr: string;
FResultList:TStrings;
protected
procedure Execute; override;
destructor Destroy; override;
procedure UpdateListBox;
public
constructor Create(T1, T2: integer; ResultList: TStrings); virtual;
end;

implementation
uses unit1;

constructor TMyPotok.Create(T1, T2: integer; ResultList: TStrings);
begin
inherited Create(true);
FreeOnTerminate := True;
FT1:= T1;
FT2:= T2;
FResultList:= ResultList;
Resume;
end;

destructor TMyPotok.Destroy;
begin
inherited;
end;

procedure TMyPotok.UpdateListBox;
var t:integer;
begin
// Form1.Listbox1.Items.add(FResultStr ); //âîò çäåñü ÷òî òî íå òî, åñëè çàêîìåíòèòü òî ðàáîòàåò
FResultList.Add(FormatDateTime('dd. mm.yyyy ddd',t));
end;


procedure TMyPotok.Execute;
var t:integer;
Year,Month,Day,dn:Word;
begin
//Form1.ListBox1.Clear;
For t:=Ft1 to Ft2 do
begin
DecodeDate(t,Year,Month,Day);
dn:=DayOfWeek(t);
If (dn=6) and (Day=13) then
FResultStr:= FormatDateTime('dd.mm.yyyy ddd',t);
synchronize(UpdateListBox);
end;
//Synchronize(UpdateListBox);
end;
//Synchronize(UpdateListBox);
end.
Он мне выводит не те даты. Посмотрите, я вам скинул проект, если вам удобно, то поправьте пожайлуста
Djavol вне форума Ответить с цитированием
Старый 02.02.2017, 21:28   #8
Djavol
Пользователь
 
Регистрация: 17.04.2016
Сообщений: 18
По умолчанию

ВСЕМ СПАСИБО! ЗАРАБОТАЛО!
Djavol вне форума Ответить с цитированием
Старый 02.02.2017, 21:36   #9
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Да не за что, главное вникайте в код который вам присылают и тогда все получиться.
Aliens_wolfs вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DLL, TThread.Synchronize STRELOK-2007 Общие вопросы Delphi 2 22.12.2013 17:32
Потоки. Закрываются все потоки при ошибке в одном. Son Общие вопросы Delphi 11 01.11.2013 09:32
Не работает Synchronize Maalik Общие вопросы Delphi 2 17.12.2012 17:41
Delphi Потоки. работа с функцией Synchronize() griha45 Помощь студентам 1 22.11.2012 23:13
Synchronize в DLL AnomaliA Общие вопросы Delphi 12 29.09.2009 13:08