Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
12 / 12 / 9
Регистрация: 12.04.2012
Сообщений: 259

Поток: программа зависает во время парсинга

12.04.2012, 19:18. Показов 5539. Ответов 39
Метки нет (Все метки)

Всем привет! В общем пишу парсер рамблера на почту. То есть собирает почты со страниц рамблер новостей.
Вот код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
#include <iostream>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TStringList *List = new TStringList;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 
 
 
 
 
AnsiString cyb=0,p=0,o;
TIdHTTP *http = new TIdHTTP(0);
 
            o=(Edit2->Text);
for(int o =0;o<=(Edit2->Text.ToInt());o++)
{
cyb = http->Get(Edit1->Text+(("?cpage=")+IntToStr( o )));
 
for(int i = 0; i < 60; i++){
 int positionone;
 int positiontwo;
positionone=cyb.Pos(("50x50"))+6;
positiontwo=cyb.Pos("/?default=boy");
Memo1->Lines->Add(cyb.SubString(positionone,positiontwo-positionone));
List->Duplicates = dupIgnore;
List->Sorted = true;
for(int i = 0; i < Memo1->Lines->Count; i++)
{
List->Add(Memo1->Lines->Strings[i]);
Label2->Caption=List->Count;
}
Memo1->Clear();
Memo1->Text = List->Text;
Memo1->Lines->Text=Trim(Memo1->Lines->Text);
cyb.Delete(1,cyb.Pos(("50x50"))+6);
cyb.Delete(1,cyb.Pos("/?default=boy"));
}
}
}
 
 
 
   //cyb = http->Get(Edit1->Text+(("?cpage=")+p));
//?default=boy          k
 
//50x50/ n   for(int o =0;o<=(Edit2->Text.ToInt());o++)
 
 
 
 
 
 
 
 
 
 
 
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Memo1->Clear();
}
//---------------------------------------------------------------------------
 
//---------------------------------------------------------------------------
 
 
 
 
void __fastcall TForm1::Button3Click(TObject *Sender)
{
   Label2->Caption=0;
   List->Clear();
   Memo1->Clear();
 
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if(SaveTextFileDialog1->Execute()){
       Memo1->Lines->SaveToFile(SaveTextFileDialog1->FileName);
}
}
//---------------------------------------------------------------------------
Ну и вроде всё работает, но я 2 день читаю про многопоточность и не понимаю как реализовать её в своей программе прошу помочь и рассказать что ещё не так в программе. Программа работает как надо только зависает на момент парсинга. Да и не судите строго это моя 2 программа (не консольная).
Всем спасибо за ранее.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.04.2012, 19:18
Ответы с готовыми решениями:

При выполнении парсинга программа зависает
Занимаюсь C# недавно. Поэтому не могу решить проблему самостоятельно. При выполнении кода программа на пару секунд (время выполнения...

Программа зависает во время работы
Здравствуйте, опять проблемка. Во время работы, прога просто виснет. Наглухо. при этом виснет только один метод. Суть - в текстовом...

Когда закидую в поток функцию время программа аварийно закрывается
Вот такая ошибка когда нажимаю запустить программу Программа меняет обои рабочего стола по времени который задает пользователь(в сек.),...

39
12 / 10 / 1
Регистрация: 04.04.2012
Сообщений: 29
13.04.2012, 22:48
Не надо в Synchronize() все запихивать, получил текст - в Synchronize вывел и т.д.
0
12 / 12 / 9
Регистрация: 12.04.2012
Сообщений: 259
13.04.2012, 23:01  [ТС]
А как по другому? куда остальной код девать? Покажите на моём коде пример плиз.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.04.2012, 23:04
В Execute(), в другие методы потока.
В начале темы я давал ссылку на программу - посмотри как там сделано. + читай Архангельского
0
12 / 12 / 9
Регистрация: 12.04.2012
Сообщений: 259
14.04.2012, 13:56  [ТС]
Пока что не получается ни чего может кто скажет почему форма зависает?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.04.2012, 17:33
По тому что к компонету из потока надо обращаться через Synchronize иначе поток просто захватывает форму, а не синхронизируется с вашими действиями по передвижению формы
0
12 / 12 / 9
Регистрация: 12.04.2012
Сообщений: 259
14.04.2012, 18:04  [ТС]
Я вроде пишу Synchronize(&Go) а в go уже делаю разве не так надо? и ещё вопрос тут начал писать прогу типо подбор паролей.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void __fastcall TForm1::Button3Click(TObject *Sender)
{
 IdSMTP1->Host = "**********";
 IdSMTP1->Port = ********;
IdSMTP1->UseTLS = utNoTLSSupport;
for(int i = 0; i < Login->Count; i++){
for(int j = 0; j < Login->Count; j++){
 IdSMTP1->AuthType = atDefault;
IdSMTP1->Password = Pass->Strings[i];
IdSMTP1->Username = Login->Strings[j];
IdSMTP1->Connect();
if(IdSMTP1->Connected()){
Memo1->Lines->Add((Login->Strings[i])+(";")+(Pass->Strings[j]));
Memo1->Text="good";
IdSMTP1->Disconnect();
}
}
}
}
Почему всё в гуд идёт, даже если пароль не правильный. Даже вроде не всё а то что после первого пароля 1 он проверил и всё потом не проверяет вроде.
0
12 / 10 / 1
Регистрация: 04.04.2012
Сообщений: 29
14.04.2012, 18:04
Один раз нажал на кнопку и зависает? Или ты несколькь раз нажимаешь -
типа многопоточное приложение?
0
12 / 12 / 9
Регистрация: 12.04.2012
Сообщений: 259
14.04.2012, 18:12  [ТС]
Не понял тебя? Приложение зависает когда нажал на кнопку потом парсинг прошел отвисло ещё раз нажал опять зависло парсинг прошёл отвисло.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.04.2012, 18:30
Ну глупо еще раз повторять... прочитай внимательно что тебе писали.
0
12 / 10 / 1
Регистрация: 04.04.2012
Сообщений: 29
14.04.2012, 19:07
Да извинит меня www.cyberforum.ru:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 void __fastcall NetThread::Execute()
 {
 while(!Terminated)
  {
  TIdHTTP *http = new TIdHTTP(0);
  str= http->Get("https://www.cyberforum.ru");
  Synchronize(Update);
  delete http;
  }
 }
 
 void __fastcall NetThread::Update()
 {
 Form1->Memo1->Lines->Add(str);
 }
Тока не надо сайты ломать, please!
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.04.2012, 19:18
Ну этот код будет постоянно грузить страницу и добовлять ее в конец мемо (зачем?) пока пользователь не остановит.
Для коротких одиночных действий можно обойтись и без while(!Terminated);
1
12 / 10 / 1
Регистрация: 04.04.2012
Сообщений: 29
14.04.2012, 19:25
Да, он так и работает.
Написал так для для Levы, чтобы понятнее было!

Ну, хотите, так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 void __fastcall NetThread::Execute()
 {
  TIdHTTP *http = new TIdHTTP(0);
  str= http->Get("https://www.cyberforum.ru");
  Synchronize(Parser);
  delete http;
 }
 
 void __fastcall NetThread::Parser()
 {
 //здесь парсим
...
...
...
 //и обращаемся к форме
 }
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.04.2012, 19:50
Да нет парсинг не должен быть в Synchronize(). В Synchronize() должены быть только ф-ции для ввода или выводы из/в компоненты

Приблизительно так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  //-----------------------------------------------------
 void __fastcall NetThread::Execute()
 {
  TIdHTTP *http = new TIdHTTP(0);
  str= http->Get("https://www.cyberforum.ru");
  TStringList* Result = new TStringList;
  Parser();
  Synchronize(Print);
  delete http,Result;
 }
 //-----------------------------------------------------
 void __fastcall NetThread::Parser() // здесь не должно быть обращенирй к компонентам, только расчеты
 {
 //... Парсинг
 Result->Add("что-то из результата");  
 //...
 }
 //-----------------------------------------------------
 void __fastcall NetThread::Print() // здесь не должно быть грамоздких вычислений, только обращения к компонентам
 {
 Form1->Memo1->Lines->Assign(Result); // Вывод
 }
//-------------------------------------------------------
Ну или парсинг должен чередоваться с выводом
1
12 / 12 / 9
Регистрация: 12.04.2012
Сообщений: 259
14.04.2012, 21:51  [ТС]
Спасибо буду пробовать)

Добавлено через 27 минут
Урааааааа спасибо вам огромное.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
//#include "Unit1.cpp"
#pragma package(smart_init)
  AnsiString cyb=0,p=0,o;
 TIdHTTP *http = new TIdHTTP(0);
 int positionone;
int positiontwo;
//---------------------------------------------------------------------------
 
//   Important: Methods and properties of objects in VCL can only be
//   used in a method called using Synchronize, for example:
//
//      Synchronize(&UpdateCaption);
//
//   where UpdateCaption could look like:
//
//      void __fastcall TMyThread::UpdateCaption()   Terminate()
//      {
//        Form1->Caption = "Updated in a thread";
//      }
//---------------------------------------------------------------------------
 
__fastcall TMyThread::TMyThread(bool CreateSuspended)
    : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall TMyThread::Execute()
{
     TIdHTTP *http = new TIdHTTP(0);
     Go();
  delete http;
}
 
 
 
 
void __fastcall TMyThread::Go()
{
o=(Form1->Edit2->Text);
for(int o =0;o<=(Form1->Edit2->Text.ToInt());o++)
{
Form1->StaticText4->Caption=o;
cyb = http->Get(Form1->Edit1->Text+(("?cpage=")+IntToStr( o )));   // Берём ссылку добавлеям кней количество введенных страниц.       //текушяя страница
for(int i = 0; i < 100; i++){
positionone=cyb.Pos(("50x50"))+6;           //Парсинг почт
positiontwo=cyb.Pos("/?default=boy");
Print();                                //Вывод количества собранных почт
cyb.Delete(1,cyb.Pos(("50x50"))+6);
cyb.Delete(1,cyb.Pos("/?default=boy"));      //Удаления позиций
 
}
}
 
}
 
 
void __fastcall TMyThread::Print()
{
Form1->Memo1->Lines->Text=Trim(Form1->Memo1->Lines->Text);
Form1->Memo1->Lines->Add(cyb.SubString(positionone,positiontwo-positionone));   //Вывод почт в мемо1   //удаление пустых строк
Form1->StaticText1->Caption=Form1->Memo1->Lines->Count;     //Вывод количества собранных почт
 
 
if(Form1->CheckBox1->State==cbChecked){
Form1->Memo1->Lines->SaveToFile("mails.txt");        //Если да то автосохранение почт в mail2.txt
}
}
 
 
 
 
 
 
 
 
 
 
 
 
//---------------------------------------------------------------------------
Код рабочий )
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.04.2012, 21:56
тут тоже обращение к компонентам их нужно было тоже поместить в Synchronize(), ну да ладно...
C++
1
2
3
4
5
6
7
void __fastcall TMyThread::Go()
{
o=(Form1->Edit2->Text); // Edit!!!
for(int o =0;o<=(Form1->Edit2->Text.ToInt());o++) // Edit!!!
{
Form1->StaticText4->Caption=o;// StaticText4!!!
cyb = http->Get(Form1->Edit1->Text+(("?cpage=")+IntToStr( o )));
1
12 / 12 / 9
Регистрация: 12.04.2012
Сообщений: 259
14.04.2012, 22:09  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
тут тоже обращение к компонентам их нужно было тоже поместить в Synchronize(), ну да ладно...
C++
1
2
3
4
5
6
7
void __fastcall TMyThread::Go()
{
o=(Form1->Edit2->Text); // Edit!!!
for(int o =0;o<=(Form1->Edit2->Text.ToInt());o++) // Edit!!!
{
Form1->StaticText4->Caption=o;// StaticText4!!!
cyb = http->Get(Form1->Edit1->Text+(("?cpage=")+IntToStr( o )));
Это не как не сделать ну может и сделать но сложно ну да ладно работает же?))

Добавлено через 11 минут
И ещё потоки в главном фале у меня известны только в
C++
1
2
3
4
5
6
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TMyThread *Thread= new TMyThread(true);
Thread->FreeOnTerminate = true;                   //Создания потока для парсинга новостей
Thread->Resume();
}
Как сделать кнопку приостановки потока. Thread->Suspend();
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.04.2012, 22:35
Это не как не сделать ну может и сделать но сложно ну да ладно работает же?))
Сейчас работает завтра нет, в том и проблема таких кодов. И к тому же сделать это просто...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
TMyThread *Thread;
//--------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Thread= new TMyThread(true);
Thread->FreeOnTerminate = true;                   //Создания потока для парсинга новостей
Thread->Resume();
}
//--------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if (Thread && !Thread->Terminated) Thread->Suspend();
}
//--------------------------------------------------------
0
12 / 12 / 9
Регистрация: 12.04.2012
Сообщений: 259
14.04.2012, 22:55  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Сейчас работает завтра нет, в том и проблема таких кодов. И к тому же сделать это просто...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
TMyThread *Thread;
//--------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Thread= new TMyThread(true);
Thread->FreeOnTerminate = true;                   //Создания потока для парсинга новостей
Thread->Resume();
}
//--------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if (Thread && !Thread->Terminated) Thread->Suspend();
}
//--------------------------------------------------------
Спасибо за код. Если завтра не будет удалю у себя билдер и за буду с++ навсегда))

Добавлено через 6 минут
Чето не робит код твой пишет [BCC32 Error] Unit1.cpp(89): E2247 'TThread::Terminated' is not accessible
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.04.2012, 23:04
Ну это видимо из за версии Buildera у меня в RAD2009 вообще этого свойства небыло
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.04.2012, 00:29
Ошибался было, но оно доступно только внутри класса потока
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.04.2012, 00:29

Зависает программа во время загрузки файла
Я создаю окно с помощь CreateDialog вот код загрузчика function DownLoadFileSock(const from,tos:string) :bool; var Site :...

Нужно вынести скачивание файла в отдельный поток (Что бы программа не провисала во время скачивания)
public void DownloadFile() { FtpWebRequest requestFileDownload =...

Выделение процесса парсинга WEB страницы в отдельный поток
Добрый день всем! Возможно некорректно выразился с названием темы. Суть вопроса. необходимо спарсить большое количество ссылок. По...

Зависает поток
Написал скрипт для проверки ответов с ссылок,но он в каокй-то момент иногда поток повисает намертво. в чем может быть причина? ...

Зависает поток
Есть код, реализующий доступ &quot;читателей&quot; и &quot;писателей&quot; к буферу Используются сигнальные сообщения. Дойдя до строки foreach (var t...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool Worker Pool — паттерн конкурентной обработки задач в Go. Суть: фиксированное количество горутин-воркеров читают задачи из общего канала и пишут результаты в общий канал результатов. . . .
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru