Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Threads, Threads - как создать потоки? 
:(
    Опции темы
Barovskiy
Дата 15.1.2006, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 15.1.2006

Репутация: нет
Всего: нет



Я сдела так


Код

procedure MyProcedure;
var
Label2: TLabel2;

begin
try 
.....
except
.............

finally
Form1.label2.caption:= 'Complite';
end;


компилируется но не работает (((((((((((((((((((((((
тоычнее начинает работать ... а потом вылетает ошибка ((((
PM MAIL   Вверх
FRAGNATIC
Дата 15.1.2006, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


Профиль
Группа: Участник
Сообщений: 901
Регистрация: 17.10.2004
Где: ICQ

Репутация: 6
Всего: 11



мой пост предыдущий читай=)
PM MAIL   Вверх
Barovskiy
Дата 15.1.2006, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 15.1.2006

Репутация: нет
Всего: нет



Цитата(FRAGNATIC @ 15.1.2006, 19:20 Найти цитируемый пост)

мой пост предыдущий читай=)


Цитата(FRAGNATIC @ 15.1.2006, 19:15 Найти цитируемый пост)


nil
те надо
var
Label6: TLabel;
...
begin
label6:=TLabel.Create(nil);



ты имеешь ввиду все что я вписал в раздел var необходимо создать и в разделе begin?

Код

procedure MyProcedure;

begin
label6:=TLabel.Create(nil); 
opendialog1:=TOpenDialog.Create(nil);
Memo1:=TMemo.Create(nil);

    try 
.....
except
.............

finally
Form1.label2.caption:= 'Complite';
end;



что типа того?
PM MAIL   Вверх
FRAGNATIC
Дата 15.1.2006, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


Профиль
Группа: Участник
Сообщений: 901
Регистрация: 17.10.2004
Где: ICQ

Репутация: 6
Всего: 11



Цитата(Barovskiy @ 15.1.2006, 19:39 Найти цитируемый пост)

ты имеешь ввиду все что я вписал в раздел var необходимо создать и в разделе begin?

если ты не кидал на форму не опендиалога не мемо а тока обхявил в вар
то их надо СОЗДАТь перед тем как к ним оброщатся=)
если ты кинул их на форму то их и объявлять в вар не надо=)
Добавлено @ 19:53
а в finally
надо освободить память типа
label6.Free
PM MAIL   Вверх
Barovskiy
Дата 15.1.2006, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 15.1.2006

Репутация: нет
Всего: нет



Цитата(FRAGNATIC @ 15.1.2006, 19:52 Найти цитируемый пост)

если ты не кидал на форму не опендиалога не мемо а тока обхявил в вар
то их надо СОЗДАТь перед тем как к ним оброщатся=)
если ты кинул их на форму то их и объявлять в вар не надо=)
Добавлено @ 19:53


у меня все на форме лежит и опендиалог и мемо .... делаю так - компилирует, но когда нажимаю на кнопку запуска потока, то он вообще не реагирует, как будто у меня в кнопке ничего не прописано (((((
сама процедура выглядит типа так

Код

procedure MyProcedure;

begin
label6:=TLabel.Create(nil); 
opendialog1:=TOpenDialog.Create(nil);
Memo1:=TMemo.Create(nil);

    Button1.enabled:=false;

    try 
.....
except
.............

finally
Form1.label2.caption:= 'Complite';
Button1.enabled:=true
end;




а код вызов процедуры так

Код

var  
h:cardinal;  

begin
CreateThread(nil,128,@MyProcedure,self,0,h);


никакой реакции
у меня даже кнопока остается активной, хотя в процедуре прописано Button1.enabled:=false;
(((((
Добавлено @ 20:15
Цитата(FRAGNATIC @ 15.1.2006, 19:52 Найти цитируемый пост)

Добавлено @ 19:53
а в finally
надо освободить память типа
label6.Free


Память в конце обязательно освобождаю, с самого начала ))))

PM MAIL   Вверх
FRAGNATIC
Дата 15.1.2006, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


Профиль
Группа: Участник
Сообщений: 901
Регистрация: 17.10.2004
Где: ICQ

Репутация: 6
Всего: 11



Цитата(Barovskiy @ 15.1.2006, 20:09 Найти цитируемый пост)

у меня все на форме лежит и опендиалог и мемо

зачем тогда их в вар объявять? они и так уже объявлены и создаются в том случаии если создана форма =)
PM MAIL   Вверх
Barovskiy
Дата 15.1.2006, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 15.1.2006

Репутация: нет
Всего: нет



Цитата(FRAGNATIC @ 15.1.2006, 20:16 Найти цитируемый пост)

зачем тогда их в вар объявять? они и так уже объявлены и создаются в том случаии если создана форма =)


всеравно не работает ((((( уже пробовал

все компилируется а работать не хочет .....
есть ли какойнибудь пример на эту тему, рабочий пример ???...
или всетаки попробовать через TThreads сделать?
PM MAIL   Вверх
Albinos_x
Дата 15.1.2006, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Цитата(Barovskiy @ 15.1.2006, 21:10 Найти цитируемый пост)

все компилируется а работать не хочет .....
есть ли какойнибудь пример на эту тему, рабочий пример ???...
или всетаки попробовать через TThreads сделать?

мы тут не телепаты... код покажи... smile


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
FRAGNATIC
Дата 15.1.2006, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


Профиль
Группа: Участник
Сообщений: 901
Регистрация: 17.10.2004
Где: ICQ

Репутация: 6
Всего: 11



Цитата(Barovskiy @ 15.1.2006, 20:09 Найти цитируемый пост)

Память в конце обязательно освобождаю, с самого начала ))))

какого начала?
финали это уже конец =)
не нравится так освобожда в другом месте тока ОДНО НО
любые переменые объявленые в ВАР любой из функций, процедуры
являются локальными и
уничтожаются в конце выполнения этой процедуры
тоесть
Цитата(Barovskiy @ 15.1.2006, 20:09 Найти цитируемый пост)

procedure MyProcedure;
begin
label6:=TLabel.Create(nil); 
opendialog1:=TOpenDialog.Create(nil);
Memo1:=TMemo.Create(nil);
    Button1.enabled:=false;
    try 
.....
except
.............
finally
Form1.label2.caption:= 'Complite';
Button1.enabled:=true
end;

после твоего end; Memo1 и так уже существовать не будет=)
так что если хош с ними работать и дальше где-то то надо их сделать глобальными перемеными а не локальными чисто для данной процедуры
Добавлено @ 22:17
гы в том коде что я ща процетировал у тя ваще переменых нету
выще они были в этойже ф-е)
PM MAIL   Вверх
Barovskiy
Дата 15.1.2006, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 15.1.2006

Репутация: нет
Всего: нет



Цитата(FRAGNATIC @ 15.1.2006, 22:15 Найти цитируемый пост)

какого начала?
финали это уже конец =)

Я имел ввиду ссамого начала создания самого проекта , гы .... ))))))))

Цитата(Albinos_x @ 15.1.2006, 22:07 Найти цитируемый пост)

мы тут не телепаты... код покажи... 


Щас попробую обяснить что я хочу сделать и че получается:-))))

У меня была фрома, на ней компонены, мемо , опендиалог, лейблы ... логмемо, кнопки старт стоп в общем все компоненты которые нужны

я выбираю в опен диалог текстовый файл в котором у меня ip адреса и мне надо получить их имена, у нас в сетке больше 120 компов, и мне нада составить список какой ip кому принадлежит ....

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

вот кусок того что было
Код

var
  s: TStrings;
  d, i: integer;
//  stop: boolean; // объявлена глобальной вверху поэтому отсюда убрал ее
begin

if filepath.Text<>'' then begin  // filepath - это обычный эдит
  s := TStringList.Create;
  Label1.Caption:='0';
Label4.Caption:='0';
Label6.Caption:='0';
Label8.Caption:='0';
Label11.Caption:='0';
Button1.Enabled:=false;
 stop:= false;
 
  try
    s.LoadFromFile (OpenDialog1.FileName);
      for d := 0 to s.Count -1 do begin
      label1.Caption:= floattostr(strtofloat(label1.Caption)+1); // пересчитываю сколько всего есть ip адресов
      end;
   for i := 0 to s.Count - 1 do begin  //  проверка для того чтоб запустить цикл
   if Stop=true then Break;
   application.ProcessMessages;
  edit1.Text := Copy (s[i],1, pos( '', s[i]) -1 );   
      Label4.Caption:=floattostr(strtofloat(Label4.Caption)+1);
      application.ProcessMessages;
      label9.Caption:='Идет проверка IP'+edit1.Text ;
      memo1.Lines.Add('Проверка  '+Edit1.Tex);

       try   // запускаю сам цикл
        begin
  ..........  // тут проверяю ip и записываю имя ip 

 except
        memo1.Lines.Add('Воткни кабель в сетевуху ...');  //  АшЫпКа
..........


finally
    s.Free;
    label9.Caption:='Complite';
    Label4.Caption:='0';
    Button1.Enabled:=true;
    memo1.Lines.SaveToFile('Log.txt');
  end;





потом как мне отпостили выше я переделал в такой вариант

Код

procedure ChecIP;
var
  s: TStrings;
  d, i: integer;
begin
// тут пошел список создания ... хотя все это есть на морде ... 
form1.filepath:= TPDJXPEdit.Create(nil);
    form1.SpeedButton1:= TSpeedButton.Create(nil);
    form1.RxLabel1:= TRxLabel.Create(nil);
    form1.Edit1:= TEdit.Create(nil);
    form1.Edit2:= TEdit.Create(nil);
    form1.Edit3:= TEdit.Create(nil);

  // кароче все что можно было я сюда впихнул 

// НИЖЕ ВСЕ что было 

if filepath.Text<>'' then begin  // filepath - это обычный эдит
  s := TStringList.Create;
  Label1.Caption:='0';
Label4.Caption:='0';
Label6.Caption:='0';
Label8.Caption:='0';
Label11.Caption:='0';
Button1.Enabled:=false;
 stop:= false;
 
  try
    s.LoadFromFile (OpenDialog1.FileName);
      for d := 0 to s.Count -1 do begin
      label1.Caption:= floattostr(strtofloat(label1.Caption)+1); // пересчитываю сколько всего есть ip //адресов
      end;
   for i := 0 to s.Count - 1 do begin  //  проверка для того чтоб запустить цикл
   if Stop=true then Break; // 
   application.ProcessMessages;
  edit1.Text := Copy (s[i],1, pos( '', s[i]) -1 );   
      Label4.Caption:=floattostr(strtofloat(Label4.Caption)+1);
      application.ProcessMessages;
      label9.Caption:='Идет проверка IP'+edit1.Text ;
      memo1.Lines.Add('Проверка  '+Edit1.Tex);

       try   // запускаю сам цикл
        begin
  ..........  // тут проверяю ip и записываю имя ip 

 except
        memo1.Lines.Add('Воткни кабель в сетевуху ...');  //  АшЫпКа
..........


finally
    s.Free;
    label9.Caption:='Complite';
    Label4.Caption:='0';
    Button1.Enabled:=true;
    memo1.Lines.SaveToFile('Log.txt');
  end;



ну самf кнопка, которая вызывает поток

Код

procedure TForm1.Button1Click(Sender: TObject);
var  
h:cardinal;  

begin
CreateThread(nil,128,@ChekIP,self,0,h);

end;



так в этом варианте все компилится и даже запускается сама программа, нажимаю на пуск - ноль эмоций.... хотя после создания все компонентов идет

Код

Button1.Enabled:=false;
 stop:= false;


кнопка так и остается доступной....
а если вырубить прогу... то такое начинается...

Добавлено @ 23:33
Цитата(FRAGNATIC @ 15.1.2006, 22:15 Найти цитируемый пост)

гы в том коде что я ща процетировал у тя ваще переменых нету
выще они были в этойже ф-е)


Я их убрал из вара
PM MAIL   Вверх
Albinos_x
Дата 15.1.2006, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Цитата(Barovskiy @ 15.1.2006, 23:26 Найти цитируемый пост)

кнопка так и остается доступной....
а если вырубить прогу... то такое начинается..

это скорее всего из-за:
Цитата(Barovskiy @ 15.1.2006, 23:26 Найти цитируемый пост)

// тут пошел список создания ... хотя все это есть на морде ... 
form1.filepath:= TPDJXPEdit.Create(nil);
    form1.SpeedButton1:= TSpeedButton.Create(nil);
    form1.RxLabel1:= TRxLabel.Create(nil);
    form1.Edit1:= TEdit.Create(nil);
    form1.Edit2:= TEdit.Create(nil);
    form1.Edit3:= TEdit.Create(nil);

компаненты уже существуют, поэтому генерируется ошибка, код завершается без обработки:
Цитата

finally
    s.Free;
    label9.Caption:='Complite';
    Label4.Caption:='0';
    Button1.Enabled:=true;
    memo1.Lines.SaveToFile('Log.txt');
  end;

т.к. блок try идёт после...
Цитата

application.ProcessMessages;

выкинь нафиг эту строку наконец... в потоке будет генерироваться ошибка...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Barovskiy
Дата 16.1.2006, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 15.1.2006

Репутация: нет
Всего: нет



Цитата(Albinos_x @ 15.1.2006, 23:42 Найти цитируемый пост)

выкинь нафиг эту строку наконец... в потоке будет генерироваться ошибка...

эту фигню я уже выкинул ....

просто код скопировал со старой версии .. .
а в потоке ее нету уже.....
Добавлено @ 00:36
Цитата(Albinos_x @ 15.1.2006, 23:42 Найти цитируемый пост)

компаненты уже существуют, поэтому генерируется ошибка, код завершается без обработки:


я убрал все.............. и при нажатии на кпопку вылетает ошибка после чего прога закрывается.....
PM MAIL   Вверх
Albinos_x
Дата 16.1.2006, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



вот тебе простенький пример(который у меня работает):
Код

Procedure Pack;
var i,j:word;
begin
form1.ListBox1.Clear;
form1.SpeedButton1.Enabled:=true;
SetLength(TypFile,0);
// поиск файлов в папке и запись адресов в массив типа запись
// функция моя так что её не ищи в делфи
RecTabAddFull(form1.DirectoryListBox1.Directory,TypFile);
i:=Length(TypFile);
for j:=0 to i-1 do
   begin
   form1.ListBox1.Items.Add(TypFile[j].rtFileName)
   end;
form1.edit1.text:='';
// запись файлов в другую папку
// тоже функция моя
if not RecordFileC(form1.DirectoryListBox2.Directory+'\Test.chid', TypFile) then
   begin
   form1.ListBox2.Items.Add('Error/');
   MessageBox(0, 'произошла ошибка. Файл не создан.', 'Test', MB_OK or MB_ICONERROR)
   end
   else
   begin
   form1.ListBox2.Items.Add('Complit/');
   MessageBox(0, 'Файл создан.', 'Test', MB_OK or MB_ICONINFORMATION);
  end;
end;

запуск:
Код

procedure TForm1.SpeedButton1Click(Sender: TObject);
var  hh:Dword;
begin
CreateThread(nil,0,@Pack,nil,0,hh);
end;

т.к. это пример поэтому расписывать написанные и используемые мной функции не стал

Это сообщение отредактировал(а) Albinos_x - 16.1.2006, 00:45


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Barovskiy
Дата 16.1.2006, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 15.1.2006

Репутация: нет
Всего: нет



Цитата(Albinos_x @ 15.1.2006, 23:42 Найти цитируемый пост)

это скорее всего из-за:


вот так везде поставил

Код

....
 try
     s.LoadFromFile (Form1.OpenDialog1.FileName);
      for d := 0 to s.Count -1 do begin
      Form1.label1.Caption:= floattostr(strtofloat(Form1.label1.Caption)+1);


      end;
   for i := 0 to s.Count - 1 do begin
   if Stop=true then Break;

.....


указал пренадлежность каждого компонента....
убрал из вара и все вот это

Цитата(Albinos_x @ 15.1.2006, 23:42 Найти цитируемый пост)

Цитата(Barovskiy @ 15.1.2006, 23:26 )

// тут пошел список создания ... хотя все это есть на морде ... 
form1.filepath:= TPDJXPEdit.Create(nil);
    form1.SpeedButton1:= TSpeedButton.Create(nil);
    form1.RxLabel1:= TRxLabel.Create(nil);
    form1.Edit1:= TEdit.Create(nil);
    form1.Edit2:= TEdit.Create(nil);
    form1.Edit3:= TEdit.Create(nil);



вывалшивает ошибку ((((((( не хочет запускать поток (((((((((
PM MAIL   Вверх
Albinos_x
Дата 16.1.2006, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Цитата(Barovskiy @ 16.1.2006, 00:26 Найти цитируемый пост)

я убрал все.............. и при нажатии на кпопку вылетает ошибка после чего прога закрывается.....

что говорит пошаговая отладка? на какой строчке ошибка?


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0789 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.