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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2010, 18:42   #11
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

я не знаю что вы наворотили в execute.

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

Код:
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;
  if suspended then
    resume;


end;
Код:
procedure TForm1.Button2Click(Sender: TObject);
var SL:TStringList;i:integer;
begin
try
sl:=TSTringList.Create;
for i:=2 to 2 do
  begin
    mas_mv[i].List(sl,form1.vl_FROMFTP.Cells[2,I],false);
    ThreadFTp[i]:=FromFTp.Create(mas_lb[i],mas_mv[i],form1.vl_TOMV.Cells[2,i],mas_pb[i],sl,form1.VL_FROMFTP.cells[2,i]);
  end;
  except on E:Exception do
    begin
      Application.MessageBox('e','e',mb_ok)
    end;
    end;
end;
Код:
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];
        application.MessageBox(PAnsiChar(ftp_catalog+Spisok.Strings[i]+' - '+loc_catalog+Spisok.Strings[i]),'1',mb_ok);
        IdFTP.Get(ftp_catalog+Spisok.Strings[i],loc_catalog+Spisok.Strings[i],True);


END;
end;

except on E:Exception do
begin

application.MessageBox(PAnsiChar(e.Message),PAnsiChar('error some'),mb_ok);
//WriteToFileError(Form2.LbEdIn.Text,E.Message);
end;
end;
PB.Position:=0;
end;
я в создал стринглист, присвоил значение. Передал в поток. Создал Поток, и только после того перезаписую переменую СЛ снова(Может вы не так глянули ибо имена одинаковые что в основной программе что в потоке).
Skype : UASm1Le.
Sm1Le вне форума Ответить с цитированием
Старый 28.10.2010, 19:12   #13
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

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

Как бы нет, я закинул и "Список" в массив, далее наварганил очень дурацкий код, с целью проверки моей гипотезы что новое место в памяти под новый поток оно не выделяет. и собственно подтвердил это. Вопрос остался прежний. При вызове я создал 1 поток, или Шаблон потока, и при вызове create(true) должно было выделять пространство в ПАМЯТИ. Хотя стоп ... при вызове create(true) - оно может и выдилело мне память но доступ к переменным я имею раньше - отсюда вывод что я создаю их еще раньше. Но почему ?!?!?! - не понимаю. Самый 1 способ это описать переменные в теле Execute, и написать некую другую процедуру которая бы забирала сама значения переменных из главного потока(формы1).

Кто что скажет ? =((
Skype : UASm1Le.
Sm1Le вне форума Ответить с цитированием
Старый 29.10.2010, 19:44   #15
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

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

конструктор исправил ... Сейчас глюк в другом ... код выложу только в понедельник ... процессы запускаются ... работает ....

Но в 50 %, запуска программы, оно виснет.(в момент переноса файла) Хотя элемент ФТП не отключается, а поток не завершается. НЕ могу понять так как когда трассируется то все ок. как запускаеш на выполнение. Иногда,часто, виснет.
Skype : UASm1Le.
Sm1Le вне форума Ответить с цитированием
Старый 30.10.2010, 14:26   #17
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ошибки:
1)один компонент idFTP на всех(у каждого должен быть свой)
2)один стринглист на всех(как я и говорил)
3)плохая работа с компонентами(нужно использовать синхронизацию)
кстати стандартный комментарий пустого модуля формы Делфи об этом говорит.

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

Последний раз редактировалось Stilet; 30.10.2010 в 15:23.
Пепел Феникса вне форума Ответить с цитированием
Старый 01.11.2010, 09:08   #18
Sm1Le
Форумчанин
 
Аватар для Sm1Le
 
Регистрация: 31.10.2008
Сообщений: 500
По умолчанию

толи я как - то не так сказал толи вы меня не поняли.

вот из главной формы
Код:
  ThreadMVIN:array[1..3]of integer;
  ThreadMVOUT:array[1..3]of integer;
  ThreadFTP:array[1..3]of TThread;
  mas_mv:array [1..count_mv] of TIDFTP;
  mas_pb:array [1..count_mv] of TProgressBar;
  mas_lb:array [1..count_mv] of TLabel;
  SL:array[1..count_mv] of TStringList;
Вот создание потоков :

Код:
procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
begin
try
for i:=1 to 3 do
  begin
    sl[i]:=TSTringList.Create;
    mas_mv[i].List(sl[i],form1.vl_FROMFTP.Cells[2,I],false);
    ThreadFTp[i]:=FromFTp.Create(i);
    sleep(100);
  end;
  except on E:Exception do
    begin
      Application.MessageBox(PAnsiChar(e.message),'e',mb_ok)
    end;
    end;
end;
Вот конструктор :
Код:
constructor FromFTP.Create(i:integer);
begin
//FreeOnTerminate:=true;
  x:=i;
  create(false);
end;
а вот и сам поток

Код:
procedure FromFTP.Execute;
var i:integer;Spisok:tstringlist;IdFTP:TIDFTP;
  loc_catalog:string;
  pb:TProgressbar;
  ftp_catalog:string;
  lbname_:TLabel;
  name:string;
begin
i:=x;
try
IdFTP:=form1.ReturnMas_mv(i);
ftp_catalog:=form1.returnLoc_catalog(i);
loc_catalog:=form1.returnFTP_catalog(i);
pb:=form1.ReturnMas_pb(i);
Spisok:=form1.ReturnSL(i);
lbname_:=form1.ReturnMas_lb(i);
name:='potok '+IntTOstr(i);
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:=Spisok.Strings[i];
        //application.MessageBox(PAnsiChar(ftp_catalog[ii]+Spisok.Strings[i]+' - '+loc_catalog[ii]+Spisok.Strings[i]),'1',mb_ok);
        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;
except on E:Exception do
begin
application.MessageBox(PAnsiChar(e.Message),PAnsiChar(name[i]),mb_ok);
//WriteToFileError(Form2.LbEdIn.Text,E.Message);
end;
end;
PB.Position:=0;
end;
,

с Одним потоком все ок .... даже с двумя ... а вот если уже больше то где то все равно баг ... единственное что одинаково и там и там это переменная, счетчик в цикле. и дурацкое присвоение i-> x:=i -> i:=x;... Но как без него х3 ... разве что написать еще одну мини функцию по возврату значения ... так как я сейчас передаю все остальные параметры ... но это бред ... не может быть все печально с потоками и передачей в нее информации.
Skype : UASm1Le.

Последний раз редактировалось Stilet; 01.11.2010 в 10:01.
Sm1Le вне форума Ответить с цитированием
Старый 01.11.2010, 09:28   #19
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

1.
Код:
lbname_.Caption:=Spisok.Strings[i];
Вы в курсе что работать с UI (VCL да везде так) из не главного потока запрещено?
2.
Код:
sl[i]:=TSTringList.Create;
Создали и забыли... Не дай бог кому такие утечки памяти.
3. Смотрю на код, к сожалению понять то что вы там написали не возможно. Главная проблема всего вашего кода, это то, что вы впихнули код вашего потока в модуль с формой, и все наворотили через переменную экземпляра вашей формы + прямое обращение к UI (уже говорил) в потоке.
4. Уберите все массивы из формы, у вас массив потоков, просто задайте для каждого потока свой StringList, и создавайте его при создании потока, и удаляйте при удалении потока. Аналогично другие переменные нужные каждому потоку. В итоге у вас в классе форме, будет только список потоков и ничего лишнего.
BOBAH13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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