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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2010, 13:26   #1
Sm1Le
Форумчанин
 
Аватар для Sm1Le
 
Регистрация: 31.10.2008
Сообщений: 500
По умолчанию Thread : Не получается многопоточность .

и так суть задачи не обязательна. Но она раскидка с ФТП сервера на локальные машины файлов.

Я создал свой шаблон потока. Название fromFTp.
и перегрузил функцию Create.
Код:
constructor FromFTP.Create(lbName:Tlabel;idFTP1:TIDFTP;catalog1:string;pb1:TProgressBar;S_L:TSTringList;catalog2:string);
begin
  create(true);
  IdFTP:=idftp1;
  loc_catalog:=catalog1;
  ftp_catalog:=catalog2;
  pb:=pb1;
  sl:=s_l;
  lbname_:=lbname;
  execute;
end;
После этого я в главном потоке, программе, в цикле вызываю создание потоков :
Код:
procedure TForm1.Button2Click(Sender: TObject);
var SL:TStringList;i:integer;
begin
sl:=TSTringList.Create;
for i:=1 to count_mv do
  begin
    mas_mv[i].List(sl,form1.vl_FROMFTP.Cells[2,I],false);
    ThreadFTp[i]:=FromFTp.Create(Form1.lbMv1,mas_mv[i],form1.vl_TOMV.Cells[2,i],mas_pb[i],sl,form1.VL_FROMFTP.cells[2,i]);
  end;
end;
Поскольку у меня весь процесс перенос файла отображается в прогресс баре, то именно по ним я и вижу что только после переноса файла на 1 сервер происходит начало переноса файла на 2 сервер и тд. . А надо что б оно не зависимо друг от друга и запускалось почти одновременно(поправка на цикл).

из видимых проблем :
1)я когда создаю поток, создаю его с параметром True тоесть в состояние Suspend(приостановленым), далее руками вызываю Execute. По логике мне надо вместо execute написать resume. Но тогда у меня в тело Execute даже не заходит. Хотя должно было ... Execute у меня описан в теле потока как :
Код:
  protected
    procedure Execute; override;
2) это не шаблон потока. а сам поток, и я просто записую дескриптор одного и того же потока в разные переменные ... Как тогда создать шаблон потока ??
Skype : UASm1Le.

Последний раз редактировалось Sm1Le; 28.10.2010 в 13:51.
Sm1Le вне форума Ответить с цитированием
Старый 28.10.2010, 14:02   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
execute;
может быть Resume ?
И
Цитата:
create(true);
Меня смущает. Я бы не переопределял Create...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.10.2010, 14:26   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Execute у меня описан в теле потока как :
Код:
  protected
    procedure Execute; override;
а что внутри? исходя из
Цитата:
Поскольку у меня весь процесс перенос файла отображается в прогресс баре
подозреваю там Synchronize.
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 28.10.2010, 15:17   #4
Sm1Le
Форумчанин
 
Аватар для Sm1Le
 
Регистрация: 31.10.2008
Сообщений: 500
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
может быть Resume ?
И Меня смущает. Я бы не переопределял Create...
ну собственно, я ничего такого там не сделал ... я перегрузил Сreate, для передачи информации в поток. А далее в вызвал стандартный метод Сreate с параметром тру.

По повду Resume. Не понимаю почему у меня программа не хочет после команды Resume продолжать работу, функцией Execute.



К примеру взял создал еще поток, Файл-Новый-Поток.
Перегрузил Create
Написал в Execute ShowMessage('1');
запустил с параметром false; - Все ок ... пошел запускаться процесс Execute. Не понимаю ... если я ничег не менял ... то почему у меня после resume ничего не происходит.

Там надо Resume. Написал. Зашел в процедуру, нажал f4, и о чудо программа заходит в процедуру. но на выполнение Get, компонента IdFTP, поток обрывается без всяких ероров. лана ща еще поищем что у меня не так...
SYnchronize - Знаю, надо, но пока не буду утруждать и без того не работающий код.

Код:
procedure FromFTP.Execute;
var i:integer;str:string;Spisok:tstringlist;
begin
try
Spisok:=sl;
If Spisok.Count>0 Then // Åñëè ñïèñîê ÍÅ ïóñòîé òî ...
Begin
For i:=0 To Spisok.Count-1 Do   // Öèêë íà ïåðåáîð ôàéëîâ èç ñïèñêà
Begin
        PB.Position:=0;
        PB.Min:=0;
        PB.Max:=IdFTP.Size(ftp_catalog+Spisok.Strings[i]);
        lbname_.Caption:=sl.Strings[i];
        IdFTP.Get(ftp_catalog+Spisok.Strings[i],loc_catalog+Spisok.Strings[i],True);

{        idFTP.delete(ftp_catalog+spisok.Strings[i]);
        Form2.ADOQuery1.close;
        sql_str:='insert into '+Form2.leNameTable.Text+'(NameOfFile,SizeOfOutFile,SizeOfInFile,DataTime,status) VALUES ("'+Spisok.strings[i]+'","'+IntTostr(IdFTP.Size(Form2.LabeledEdit2.Text+
Spisok.Strings[i]))+'","'+inttostr(getFileSize(str))+'","'+DateTimeToStr(Now)+'",'+'"in"'+')';
        Synchronize(InsertIntoDB);
        Form2.ADOQuery1.ExecSQL;}
END;
end;
Skype : UASm1Le.

Последний раз редактировалось mihali4; 28.10.2010 в 23:09. Причина: Дописал
Sm1Le вне форума Ответить с цитированием
Старый 28.10.2010, 15:48   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
constructor FromFTP.Create(lbName:Tlabel;idFTP1:TIDFTP;catalog1:string;pb1:TProgressBar;S_L:TSTringList;catalog2:string);
begin
  inherited create(true);
  IdFTP:=idftp1;
  loc_catalog:=catalog1;
  ftp_catalog:=catalog2;
  pb:=pb1;
  sl:=s_l;
  lbname_:=lbname;
  resume;
end;
а не происходило потому что вы конструктор изменили.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.10.2010, 15:51   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
inherited create(true);
Вот и меня такое смутило...
Не стоит так делать ИМХО...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.10.2010, 16:02   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

можно так делать спокойно, главное не забывать вызывать конструктор через inherited

такое очень полезно когда делаешь специфические потоки и хочешь чтоб они спокойно вписывались в массив TThread(или же не умеем самостоятельно делать потоки)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.10.2010, 16:32   #8
Sm1Le
Форумчанин
 
Аватар для Sm1Le
 
Регистрация: 31.10.2008
Сообщений: 500
По умолчанию

можно ли создать 2 потока типа FromFTP(в моем случае) одновременно ?

Ошибки исправил. Спасибо.
Skype : UASm1Le.
Sm1Le вне форума Ответить с цитированием
Старый 28.10.2010, 16:37   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

да можно, ваш цикл это и делал.

правда изза кривого конструктора он делал не правильно это.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 28.10.2010 в 16:39.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.10.2010, 18:37   #10
Sm1Le
Форумчанин
 
Аватар для Sm1Le
 
Регистрация: 31.10.2008
Сообщений: 500
По умолчанию

и так ....

Получается когда я цикл отменяю, выполняю только к примеру i=1, то все ок, как только делаю цикл хотя бы из двух элементов ошибка, ошибка доступа к файлу.

Другими словами по моей логике, у меня когда запускается "2 поток" он накрывает 1, и они оба обращаются по одним и тем же путям. Проверено при помощи ShowMessage. =))))))

скажем так эти потоки вообще не должны встречаться, в параметрах у них указаны разные директории, как те что на фтп, так и те куда копировать.
Если выполнить любой из потоков отдельно, то все работает.

Кто че скажет ? ... не понимаю ...
Skype : UASm1Le.
Sm1Le вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Thread в Windows From Application Flay Windows Forms 7 24.08.2010 21:28
Thread и элементы формы. divers Общие вопросы .NET 4 20.04.2010 18:56
Thread Cpluser Общие вопросы .NET 6 30.03.2010 23:32
thread вешает приложение amaroktmb Общие вопросы Delphi 9 12.01.2010 23:06
Проблема с Thread Arnezami Общие вопросы .NET 2 04.10.2009 22:08