Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];

Вниз

Потоки   Найти похожие ветки 

 
Аноним   (2004-03-04 15:03) [0]

Создаю поток (описанный во внешнем модуле), запускаю, а он зараза вешает прогу до завершения своего Execute.

Как сделать, чтобы не вещал?


 
Юрий Зотов ©   (2004-03-04 15:06) [1]

> Как сделать, чтобы не вещал?

Два способа - либо сделать Execute пустым, либо устранить ошибку. Обычно она находится в 17-й строке.


 
Внук ©   (2004-03-04 15:06) [2]

Убрать Synchronize, наверно :)))


 
pasha_golub ©   (2004-03-04 15:07) [3]

Либо код показать


 
Аноним   (2004-03-04 15:11) [4]

procedure TMyThread.Execute;
var
  Client: TTcpClient;
  Connect: boolean;
begin
    Client := TTcpClient.Create(nil);
    Client.RemoteHost := "кому-то там";
    Client.RemotePort := "куда-то там";
    Connect := false;
    try
      while (not Terminated) do begin
        try
          if Client.Connect then begin
            {...}
            break;
          end;
        except
          if not(ExceptObject is EAbort) then
              Synchronize(Client.Disconnect);
        end;
      end;
    finally
      Client.Free;
    end;
end;


 
Аноним   (2004-03-04 15:27) [5]

Дык, как?


 
Семен Сорокин ©   (2004-03-04 15:33) [6]

отладка не помогает?
а что здесь: {...}


 
Юрий Зотов ©   (2004-03-04 15:34) [7]

Жмем F1 и видим, что в Synchronize должен указываться метод ПОТОКА. А не Client.Disconnect.


 
Digitman ©   (2004-03-04 15:40) [8]

а зачем здесь Synchronize() применен ?

и вообще ... у меня нет описания класса TTCPClient, и что-то непонятно, то ли Connect - это свойство, то ли метод ... обращаешься ты к нему как-то фривольно) ...


> до завершения своего Execute


и при каком условии, по твоему, этот Execute завершается ? И корректно ли завершается ? И где внешний блок try..except в теле Execute ? На каком основании ты предполагаешь, что ты  вовремя обрабатываешь ВСЕ потенциально возможные исключения в Execute ?


 
Аноним   (2004-03-04 15:40) [9]

TO

Т.е. так?

type
   TMyThread = class(TThread)
     Client: TTcpClient;
     procedure Execute;
     procedure Disconnect;
   end;

implementation

procedure TMyThread.Disconnect;
begin
    Client.Disconnect;
end;

procedure TMyThread.Execute;
begin
    Client := TTcpClient.Create(nil);
    Client.RemoteHost := "127.0.0.1";
    Client.RemotePort := "25";
    try
      while (not Terminated) do begin
        try
          if Client.Connect then begin
            {здесь пока ничего нет}
            break;
          end;
        except
          if not(ExceptObject is EAbort) then
              Synchronize(Disconnect);
        end;
      end;
    finally
      Client.Free;
    end;
end;

Не работает. Тож же эффект.


 
Reindeer Moss Eater ©   (2004-03-04 15:45) [10]

Наверняка в главном потоке сделано что - то вроде:

Thread:=CreateMyThread;
Thread.WaitFor;

Вот он и "вешается" на все время Еxecute


 
Verg ©   (2004-03-04 15:48) [11]


> Юрий Зотов ©   (04.03.04 15:34) [7]
> Жмем F1 и видим, что в Synchronize должен указываться метод
> ПОТОКА. А не Client.Disconnect.


Вообще sync-у плевать, если помнится, что там за метод - сделает все равно, главное, чтобы был procedure of object.


 
Аноним   (2004-03-04 15:49) [12]

TO Reindeer Moss Eater

Нет. Все просто...

procedure TForm1.Button1Click(Sender: TObject);
begin
    MyThread := TMyThread.Create(true);
    MyThread.Execute;
end;


 
Reindeer Moss Eater ©   (2004-03-04 15:52) [13]

  MyThread.Execute;

?!

Действительно просто.


 
Verg ©   (2004-03-04 15:52) [14]


> Аноним   (04.03.04 15:49) [12]
> TO Reindeer Moss Eater
>
> Нет. Все просто...
>
> procedure TForm1.Button1Click(Sender: TObject);
> begin
>     MyThread := TMyThread.Create(true);
>     MyThread.Execute;> end;


:))))))
Изивите, нет времени....


 
Digitman ©   (2004-03-04 15:53) [15]


> Аноним   (04.03.04 15:49) [12]


все ясно)


>     MyThread.Execute;


это зачем ?

просто

MyThread := TMyThread.Create(False);


 
Reindeer Moss Eater ©   (2004-03-04 15:53) [16]

В каком полку ... В какой автошколе программировать учились?


 
Аноним   (2004-03-04 15:55) [17]

Сдурил.... Извините, что отнял так много времени....


 
Аноним   (2004-03-04 15:56) [18]

Еще разок.... вылетает "Abstract Error"


 
Reindeer Moss Eater ©   (2004-03-04 15:57) [19]

Не сотвори себе экземпляров абстрактных классов


 
Аноним   (2004-03-04 16:00) [20]

.....Это какие? (я уже ничего не понимая, у меня истерика)


 
Семен Сорокин ©   (2004-03-04 16:02) [21]

Аноним   (04.03.04 15:56) [18]
Еще разок.... вылетает "Abstract Error"


TMyThread = class(TThread)
public
 procedure Execute; override;
end;


 
Digitman ©   (2004-03-04 16:04) [22]


> у меня истерика


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


 
Аноним   (2004-03-04 16:09) [23]

TO Digitman ©

>> элементарными навыками трассировки/отладки своих приложений

а как Вы на debug"ере отловите эту ошибку, интересно....


 
Семен Сорокин ©   (2004-03-04 16:10) [24]

а как Вы на debug"ере отловите эту ошибку, интересно....
молча


 
Внук ©   (2004-03-04 16:11) [25]

Вот набросились на человека :))


 
Аноним   (2004-03-04 16:13) [26]

TO Семен Сорокин ©

Я рад за Вас, но у меня этого не получилось.


 
Семен Сорокин ©   (2004-03-04 16:17) [27]

Аноним   (04.03.04 16:13) [26]
ладно не нервничай, отключи оптимизацию в св-вах, сделай билд проекта. Поставь точку останова, запусти, после останова - пошагово (F8), можешь пользоваться дополнительными окнами View->Debug windows.
В случае ошибки вызови Call Stack (Ctrl+Alt+S) посмотри метод, в котором отвалился.
Попробуй - должно получиться.


 
Digitman ©   (2004-03-04 16:21) [28]


> а как Вы на debug"ере отловите эту ошибку, интересно....


какую ? конкретно ?


 
Аноним   (2004-03-04 16:21) [29]

To Семен Сорокин © [27]

Спасибо.


 
имя   (2004-03-05 01:38) [30]

Удалено модератором



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.04 c
3-1077634767
overword
2004-02-24 17:59
2004.03.28
Непонятки с добавлением Interbase


1-1078988652
TransparentGhost
2004-03-11 10:04
2004.03.28
Как передать формулу =SUMIF(AC5:AC64;">0";L5:L64) в Excel ?


1-1078758642
Гарри Поттер
2004-03-08 18:10
2004.03.28
Поворот картинки


3-1077811556
Coder
2004-02-26 19:05
2004.03.28
1001-ый вопрос про Access (многопользовательский доступ)


1-1078408685
Timego
2004-03-04 16:58
2004.03.28
Архитектура приложения





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский