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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка Code 1400 
V
    Опции темы
rodendron
Дата 25.6.2007, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Добрый день,
перечитал почти весь форум на тему ошибки Code 1400. Сделал вывод, что неверный дескриптор окна случается в случае, только если во время потока появляются сообщения.

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

У меня работает с помощью Indy парсинг веб страниц. 
В цикле запускается парсинг 10 страниц. При этом, даже в случае, если во время Http.Get НЕ появляются сообщения(страница не доступна и т.д.), то все равно после успешного завершения возникает эта ошибка.

Что я еще могу делать не так? Заранее благодарю вас за ответы по этой теме.

Добавлено через 5 минут и 30 секунд
Добавлю код:

  hThread: THandle;
  ThreadId : DWord;

Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  stResult := '';
  hThread  := CreateThread(nil,128,@Thread2,self,0,ThreadId);
  while stResult = '' do Application.ProcessMessages;
  TerminateThread(hThread,0);
  CloseHandle(hThread);
  ShowMessage(stResult);
end;

function Thread2(Pt : Pointer) : LongInt; stdcall;
begin
  try
    LinksCount := 0;
    PagesCount := 0;
    Form1.StartParse;
    stResult := 'Выполнено!';
  finally
    SendMessage(Application.Handle, WM_ACTIVATEAPP, 1, 0);
  end;
end;

procedure TForm1.StartParse;
var
 x,p: integer;
begin
//Прописываю настройки прокси
  InitUrls;
//Генерирую рандомом имена файлов
  Filename;
//Удаление одинаковых страниц
//в Memo удаляю если вдруг в 10 из 10 страниц вкралась повторная
  DeleteDuplicates;
//Удаление тегов из имени страниц
  str := Memo4.Text;
  Pars3;
  Memo4.Text := str;
//  Label14.Caption := 'Обработка ссылок';
//  Label12.Caption := IntToStr(Memo4.Lines.Count);
  For x:=0 to (Memo4.Lines.Count-1) do
    begin
      p:=x+1;
//Запускаю парсинг страниц(получаю страницу, обрабатываю ее, получаю в Memo нужную инфу)
      doParse(Memo4.Lines[x]);
//Сохраняю все в фаил
      Save;
//      Label13.Caption := IntToStr(p);
//      ProgressBar1.Position := Ceil(p*100/Memo4.Lines.Count);
    end;
end;


Добавлено через 8 минут и 31 секунду
Причем первый поток, в котором схожие операции, я запускаю по ТОЧНО такой же схеме, и ошибки не возникают.

А этот поток я могу запустить как после того, так и отдельно, заполнив страницы.
Ошибка возникает в обоих случаях. Если в первом можно было бы еще чего подумать, то вот странно что когда отдельно - тоже.
PM MAIL   Вверх
MetalFan
Дата 25.6.2007, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



жэсть... из другого потока к форме и копмонентам обращаться... про потокобезопасный код слышали?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
rodendron
Дата 25.6.2007, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



MetalFan, 
Да я программист на другом языке, тут пришлось за Делфи взяться, времени на изучение всего как всегда минус месяц.
Где я накосячил?
PM MAIL   Вверх
Alexeis
Дата 25.6.2007, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



rodendron, Делфи тут ни при чем. Потоки они и в африке потоки. Думаю нужно начать с этого http://forum.vingrad.ru/index.php?show_typ...76&view=all
  Без хорошего понимания работы с потоками проблемы будут постоянно, потому сначала RTFM.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
rodendron
Дата 25.6.2007, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Alexeis, 
Спасибо, я это видел.

Времени читать нет - все сроки горят. Ладно, буду сдавать приложение с ошибкой - деваться некуда...

Всем спасибо. Я просто думал что причины только в сообщениях. 
А порядка 60 процедур сейчас нет возможности по отдельности там в поток пихать или как еще. 
PM MAIL   Вверх
Alexeis
Дата 25.6.2007, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(rodendron @  25.6.2007,  10:49 Найти цитируемый пост)
Времени читать нет - все сроки горят. Ладно, буду сдавать приложение с ошибкой - деваться некуда...

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

Добавлено через 45 секунд
  От такой программы будет больше вреда чем пользы.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
rodendron
Дата 25.6.2007, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Alexeis, 
хм, но какую-то информацию она выводит же все же...

У меня там 2 базовых функционала выполняющих примерно одинаковые функции.

Так вот, первый работает идеально и без ошибок. А второй то с ошибками, то без ошибок. Вот никак не пойму в чем может быть проблема. Если бы он всегда работал с ошибками, или в первом хоть иногда были, а тут...

В 2 словах, хоть что это может быть?
PM MAIL   Вверх
Alexeis
Дата 25.6.2007, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Дело тут 
Код

function Thread2(Pt : Pointer) : LongInt; stdcall;
begin
  try
    LinksCount := 0;
    PagesCount := 0;
    Form1.StartParse;
    stResult := 'Выполнено!';
  finally
    SendMessage(Application.Handle, WM_ACTIVATEAPP, 1, 0);
  end;
end;


в строчке  Form1.StartParse;

Добавлено через 2 минуты и 25 секунд
вместо вызова функции лучше отправить сообщение одному из окон главного потока.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
rodendron
Дата 25.6.2007, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Alexeis, я об этом тоже подумал.

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

Код

function Thread1(Pt : Pointer) : LongInt; stdcall;
begin
  try
    Form1.GetAllUrl;
    stResult := 'Выполнено!';
  finally
    SendMessage(Application.Handle, WM_ACTIVATEAPP, 1, 0);
  end;
end;

PM MAIL   Вверх
Alexeis
Дата 25.6.2007, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(rodendron @  25.6.2007,  12:04 Найти цитируемый пост)
А почему тогда тот самый первый случай, о котором я писал, отрабатывает нормально?

  Зависит от того какой метод вызывается. Может просто случайно. В общем случае это не работает. Скажем если метод формы ничего не делает кроме отправки сообщения, то он может отработать без ошибок.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
rodendron
Дата 25.6.2007, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Alexeis, 
Возможно, глупый вопрос, но мне стоит вынести все процедуры за область формы?
Или как лучше быть?

P.S.: Сейчас на тестах нашел ссылку, по запуску которой возникает эта ошибка. Но пока не могу разобраться что и как.
PM MAIL   Вверх
Alexeis
Дата 25.6.2007, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(rodendron @  25.6.2007,  12:18 Найти цитируемый пост)
Возможно, глупый вопрос, но мне стоит вынести все процедуры за область формы?

  Текущая проблема в том что происходит одновременный доступ двух и более потоков к одной области данных. Если разрулить то ошибок не будет.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MetalFan
Дата 25.6.2007, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



Цитата(Alexeis @  25.6.2007,  12:14 Найти цитируемый пост)
в строчке  Form1.StartParse;

Добавлено через 2 минуты и 25 секунд
вместо вызова функции лучше отправить сообщение одному из окон главного потока.

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


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
rodendron
Дата 25.6.2007, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Alexeis, 
Мда, буду читать теорию. Искать время надо будет, ночью вероятно.
Получается, что один поток - в нем несколько операций?
Я же просто открываю поток - все делаю, потом его закрываю.

Добавлено через 4 минуты и 23 секунды
Честно говоря, начнем с того, что мне потоки не нужны - я их стал использовать только ради того, чтобы у меня приложение при объемных процедурах не висело. Чтобы я мог его сворачивать, разворачивать.

В общем можете посоветовать мне выпить яду...

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

Тут я стал рыться в архивах - не нашел его... Спросил у друга, который еще больший ламер, чем я, мол как мне сделать так, чтобы по нажатии клавиши "Выолнить", у меня приложение не висело, а позволяло нажать клавишу STOP, показывало прогресс бар и т.д. - он мне скинул пример с потоками - сказал что так нужно делать.

Может тогда, раз у меня там выполняются 2 громоздкие процедуры ПОСЛЕДОВАТЕЛЬНО(не параллельно), то и не стоит юзать поток?

Я кажется тогда делал с помощью Application.Messages или Handle...

Блин, как же тяжело каждые 2-3 месяца слезать на разные языки программирования :(

Подскажите пожалуйста.
PM MAIL   Вверх
Alexeis
Дата 25.6.2007, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



rodendron, лучше организовать поток так что он получил копии всех необходимых ему данных сразу (или те данные больше никто не должен использовать). И только после этого начинал работу, а после окончания работы второго потока основной поток должен сам "достать" результаты работы дополнительного. Это идеальный вариант, когда никто никому не мешает.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

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

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

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

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

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


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

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


 




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


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

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