Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9

Синхронизация потоков

26.11.2014, 23:15. Показов 1434. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем проблема состоит в том, что у меня не получается синхронизировать потоки.
Предисловие:
есть класс Parsing, созданный мной, а также есть наследник класса TThread - класс Pars.
В классе Parsing описано 4 метода :
1) Ввод данных
C++
1
2
3
4
5
void Parsing::Proxy_create(string proxy,string port)
{
    proxy_private = proxy;
    port_private = port;
}
2) Вывод данных в файл
C++
1
2
3
4
5
6
7
void Parsing::SaveToFile()
{
    ofstream cout("OUTPUT.txt",ios::app);  // открываем файл и дописываем в него
    cout << "\tProxy - " << proxy_private << "\tPort - " << port_private
    << "\tThred - " << thr_private << endl;
    cout.close();
}
3) Задание идентификатора потока
C++
1
2
3
4
void Parsing::Thr(string thr)
{
    thr_private = thr;
}
4) Возврат прокси
C++
1
2
3
4
String Parsing::Get_proxy()
{
    return AnsiString(proxy_private.c_str());
}
А также 3 типа данных:
C++
1
2
3
string proxy_private;
string port_private;
string thr_private;
Unit1
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
Pars **Thr;
using namespace std;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    InitializeCriticalSection(&CS);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button15Click(TObject *Sender)
{
 Parsing *c = new Parsing(); // объект класса парсинга
 int count( StrToInt( Edit5->Text ) ); // Количество потоков
 TStringList PROXY_list = new TStringList();
 PROXY_list->LoadFromFile(ExtractFileDir(Application->ExeName)+"//PROXY.txt");
 Thr = new Pars *[count];
 String NameThr;
 /*создаем потоки*/
 /*создаем потоков столько, сколько проксей - их 24*/
    for(Form1->iter = 0; Form1->iter < PROXY_list->Count() ; Form1->iter++)
    {
      c->Proxy_create(AnsiString(PROXY_list->Strings[Form1->iter].SubString(0,ip-1)).c_str(),AnsiString(PROXY_list->Strings[Form1->iter].SubString(ip+1,PROXY_list->Strings[Form1->iter].Length())).c_str()); /*создаем прокси*/
      NameThr = "Thr"+(String)Form1->iter;  // индивидуальный номер потока
      Thr[Form1->iter] = new Pars(true,c,NameThr);
      Thr[Form1->iter]->Priority = tpLower;
      Thr[Form1->iter]->FreeOnTerminate = true;
      Thr[Form1->iter]->Start();
      Memo1->Lines->Add("поток создан"); 
             /*тут нареканий нет - след. 2 строки(выводят все хорошо)*/
      Memo3->Lines->Add( c->Get_proxy() ); // выводим прокси текущего потока для проверки
      Memo3->Lines->Add( NameThr ); // выводим индивидуальный номер потока
      sleep(1);
      Application->ProcessMessages();
    }
 }
 //---------------------------------------------------------------------------
 void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
    DeleteCriticalSection(&Form1->CS);
    delete[] Thr;
    Application->Terminate();
}

Unit2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
__fastcall Pars::Pars(bool CreateSuspended, Parsing *copy, String Name)
    : TThread(CreateSuspended)
{
    this->clone = copy;
    this->clone->Thr(AnsiString(Name).c_str());
    this->Name = Name;
}
//---------------------------------------------------------------------------
void __fastcall Pars::Execute()
{
    Synchronize(&UpdateMemoYes);
    EnterCriticalSection(&Form1->CS);
        clone->SaveToFile();
    LeaveCriticalSection(&Form1->CS);
}
//---------------------------------------------------------------------------
void __fastcall Pars::UpdateMemoYes()
{
    Form1->Memo1->Lines->Add(clone->Get_proxy() + " iter " + Form1->iter + "  " + this->Name);
}
pruf1 - это данные из файла.
Не корректно вывел.
HTML5
1
2
3
4
поток создан
поток создан
173.23.165.114  iter 14 Thr14
173.23.165.114  iter 14 Thr13
pruf - это данные из Memo1
Тут вообще сущий ужас.
Вложения
Тип файла: txt pruf.txt (1.3 Кб, 4 просмотров)
Тип файла: txt pruf1.txt (1.2 Кб, 3 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.11.2014, 23:15
Ответы с готовыми решениями:

Синхронизация потоков
Есть класс class CFrameBufferObserver : public VsCoreLib::IFrameBufferObserver { VsCoreLib::IFrameBuffer* m_frame_buffer; ...

Синхронизация потоков: семафоры
Всем доброго времени суток. Друзья есть простое приложение которое выводит 2 последовательности: #include &lt;iostream.h&gt; #include...

Синхронизация потоков. Семафоры
Приветствую. Как синхронизировать 3 потока относительно одного? т.е. когда работает один поток - три другие ждут. Когда...

3
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
27.11.2014, 09:50
Что происходит-то? Где и при каких условиях косяк? Какое поведение?
Можно ли услышать поподробнее?
0
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
28.11.2014, 00:17  [ТС]
Потоки (их 24) должны вывести 24 прокси, каждый поток свою проксю. Но этого не происходит.
Кроме того, я вывожу из потока его проксю и идентификатор в мемо:
C++
1
Synchronize(&UpdateMemoYes);
Но и тут тоже выводит не верно:
HTML5
1
2
3
4
поток создан
поток создан
173.23.165.114  iter 14 Thr14
173.23.165.114  iter 14 Thr13
Должно:
HTML5
1
2
3
4
поток создан
173.167.143.29  iter 13 Thr13
поток создан
173.23.165.114  iter 14 Thr14
А вывод в файл вообще не предсказуемый:
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    Proxy - 184.90.146.71   Port - 53709    Thred - Thr0
    Proxy - 188.26.122.252  Port - 22443    Thred - Thr1
    Proxy - 200.105.246.219 Port - 8000 Thred - Thr3
    Proxy - 200.105.246.219 Port - 8000 Thred - Thr3
    Proxy - 201.20.110.58   Port - 443  Thred - Thr5
    Proxy - 201.20.110.58   Port - 443  Thred - Thr5
    Proxy - 202.154.102.12  Port - 41202    Thred - Thr7
    Proxy - 202.154.102.12  Port - 41202    Thred - Thr7
    Proxy - 14.139.251.54   Port - 1080 Thred - Thr9
    Proxy - 151.237.21.97   Port - 36611    Thred - Thr10
    Proxy - 159.224.20.76   Port - 1080 Thred - Thr11
    Proxy - 172.240.27.33   Port - 20000    Thred - Thr12
    Proxy - 173.167.143.29  Port - 42014    Thred - Thr13
    Proxy - 173.167.143.29  Port - 42014    Thred - Thr13
    Proxy - 173.3.24.196    Port - 29339    Thred - Thr15
    Proxy - 173.3.24.196    Port - 29339    Thred - Thr15
    Proxy - 176.73.142.89   Port - 1080 Thred - Thr17
    Proxy - 176.73.142.89   Port - 1080 Thred - Thr17
    Proxy - 178.171.36.104  Port - 20222    Thred - Thr18
    Proxy - 180.153.139.246 Port - 8888 Thred - Thr19
    Proxy - 222.169.11.34   Port - 8080 Thred - Thr21
    Proxy - 222.169.11.34   Port - 8080 Thred - Thr21
    Proxy - 36.76.112.152   Port - 8080 Thred - Thr23
    Proxy - 36.76.112.152   Port - 8080 Thred - Thr23
Не все потоки выводят прокси, а некоторые выводят по два раза.
Скажите, как нужно синхронизировать потоки, ведь так, как это делаю я, явно не подходит.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
08.12.2014, 10:00
Попробуйте:
Вход в критическую секцию переделать через TryEnterCriticalSection.

Во втором модуле объявить критическую секцию внешней:
C++
1
extern CRITICAL_SECTION CS;
Запись в файл в методе Parsing::SaveToFile() переделать через TFileStream.

Цитата Сообщение от Gdasar Посмотреть сообщение
А вывод в файл вообще не предсказуемый
Очень предсказуемый. Кто успел, тот и съел. Если вы хотите, чтобы они по очереди записывали, в порядке возрастания номеров потоков, то используйте семафор. Или вообще не используйте потоки.

Я бы критическую секцию выкинул бы и реализовал подобное через очередь событий (Event). Поток создался, сгенерировал событие. В главном потоке лупится перебор всех дочерних: если событие текущего потока установлено в сигнальное состояние, что означает, что он сформирован и его данные подготовлены для записи, то отправить его на печать или куда там. Если нет, то ждать. Либо пропустить и проверять следующий.

Далее:
Цитата Сообщение от Gdasar Посмотреть сообщение
String Parsing::Get_proxy() { return AnsiString(proxy_private.c_str()); }
В чем смысл испоьзовать вперемешку String и AnsiString? Все заменить на String.
Цитата Сообщение от Gdasar Посмотреть сообщение
А также 3 типа данных:
string proxy_private;
string port_private;
string thr_private;
Строки имеют тип string или String? И опять же зачем, если первое?

В первом модуле в волшебной кнопке номер пятнадцать сколько раз вызывается оператор new и сколько раз потом delete?
C++
1
2
3
4
5
Thr = new Pars *[count];
...
Thr[Form1->iter] = new Pars(true,c,NameThr);
...
delete[] Thr;
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.12.2014, 10:00
Помогаю со студенческими работами здесь

Синхронизация потоков. Мьютексы
Не могу никак разобраться, почему не работает синхронизация с помощью мьютекса. Создаю мьютекс hMutex =...

Класс Thread, потоки синхронизация потоков и т.д
Имеется код: Модуль Unit1.cpp (в нем запускается поток) //------------------------------------------------------ //... ...

Синхронизация потоков с++
Реализовать модуль создающий 4 балансировочных потока обеспечивающий 100% загрузку CPU (A,B,C,D). Каждый поток должен выводить на консоль...

Синхронизация потоков на элементарном уровне (переключение потоков)
в общем разбираюсь с потоками, на сколько понял мне нужен lock Вот имеется просто пример public void RunAdd() ...

Синхронизация потоков: проблема гонки потоков
Есть проблема в синхронизации потоков, которую я не знаю, как решить. Точнее у меня получается типичная гонка потоков. Есть функция,...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru