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

Многопоточность - как создать динамический массив потоков

04.04.2013, 23:36. Показов 11807. Ответов 55
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем
Вот решил заняться многопоточность и,как и у всех,возникли проблемы.
1) как создать динамический массив потоков?
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
43
//---------------------------------------------------------------------------
 
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
 
#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TMyThread *Thr[1];
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 int i;
 for(i=0;i<Memo1->Lines->Count;i++)
 {
  Thr[i] = new TMyThread(true);
  Thr[i]->Priority=tpLower;
  Thr[i]->FreeOnTerminate=true;
  Thr[i]->Resume();
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 InitializeCriticalSection(&cs);
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
 DeleteCriticalSection(&cs);
}
//---------------------------------------------------------------------------
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.04.2013, 23:36
Ответы с готовыми решениями:

Как создать динамический массив координат?
Проводишь мышкой какую-то кривую по image и координаты это кривой должны заносится в динамический масиив ? Вот примерный код только...

Как создать динамический массив TStringList
При использовании этого кода вылетает ошибка EAccessViolation. Подскажите, что тут неправильно? TStringList *sl; Объявляю в...

Как создать динамический массив кнопок?
Как создать динамический массив кнопок MVS 2010 или builder 6

55
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
29.04.2013, 23:47  [ТС]
Студворк — интернет-сервис помощи студентам
Avazart, TIdNotify из Indy? Ведь так?!
Если так,то это совсем из другой оперы.

Добавлено через 8 часов 27 минут
До меня так что-то и не дойдет,как организовать выполнение парсинга в 10 и более потоков.
C++
1
2
3
4
5
6
7
8
9
10
11
12
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 int count( StrToInt( Edit3->Text ) );
 TMyThread **Thr = new TMyThread *[count];
 for( int i = 0; i < count; ++i )
 {
   Thr[i] = new TMyThread(true);
   Thr[i]->Priority = tpLower;
   Thr[i]->FreeOnTerminate = true;
   Thr[i]->Resume( );
  }
}
count задаю равным и 10 и 15 и 20,но все равно парсинг происходит в 1 поток. Подскажите пожалуйста.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.04.2013, 23:49
Цитата Сообщение от Gdasar Посмотреть сообщение
Avazart, TIdNotify из Indy? Ведь так?!
Не нравится Indy юзайте WinApi сообщения ...
0
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
30.04.2013, 00:45  [ТС]
Avazart, я не понимаю,каким боком тут индюк вообще?!
Пишите по-теме,а не то,что вам нравиться!
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
30.04.2013, 00:47
Цитата Сообщение от Gdasar Посмотреть сообщение
я не понимаю
Никто не сомневается ...

P.S. Я писал для SatanaXIII.
0
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
30.04.2013, 00:50  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Не нравится Indy юзайте WinApi сообщения ...
Это тоже для него писал?!
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
30.04.2013, 09:17
Цитата Сообщение от Avazart Посмотреть сообщение
Не нравится Indy юзайте WinApi сообщения ...
Да, вон Ramoncheg писал уже недавно крутую штуку на WinApi. А я все пытаюсь к средствам борланды все свести.

Цитата Сообщение от Gdasar Посмотреть сообщение
До меня так что-то и не дойдет,как организовать выполнение парсинга в 10 и более потоков.
А если попробовать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 int count( StrToInt( Edit3->Text ) );
 TMyThread **Thr = new TMyThread *[count];
 for( int i = 0; i < count; ++i )
 {
   Thr[i] = new TMyThread(true);
   Thr[i]->Priority = tpLower;
   Thr[i]->FreeOnTerminate = true;
   Thr[i]->Resume( );
   Application->ProcessMessages();
  }
}
и до кучи:
C++
1
2
3
4
5
6
void __fastcall TMyThread::Execute()
{
  {
  ...
  Sleep(1);}
}
P.S.
Есть такая замечательная штука
как
C++
1
Sleep(0);
1
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
30.04.2013, 14:22  [ТС]
SatanaXIII, все равно в один работает
0
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
21.06.2013, 23:30  [ТС]
Привет всем
По этому коду создается 100 потоков,которые должны каждую строчку в СтрингЛисте перевести в транслит:

Unit1

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 int count( StrToInt( Edit3->Text ) );
 TMyThread **Thr = new TMyThread *[count];
 for( int i = 0; i < count; ++i )
 {
   Thr[i] = new TMyThread(true);
   Thr[i]->Priority = tpLower;
   Thr[i]->FreeOnTerminate = true;
   Thr[i]->Resume( );
   Application->ProcessMessages();
  }
}
Unit2
C++
1
2
3
4
5
6
7
8
9
10
11
12
void __fastcall TMyThread::Execute()
{
...
...
 while(Form1->o<Form1->Sections->Count) ///Sections-это СтрингЛист
 {
...
...
 }
...
...
}
Но после выполнения одного шага цыкла While поток перестает работать(умирает)... В итоге в транслит переводются лишь 100 строчек.
Как мне сделать так,что бы потоки "умирали" тогда,когда все сточки в СтрингЛисте переведуться в транслит?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
22.06.2013, 00:45
Давай весь код без многоточий...
0
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
22.06.2013, 00:52  [ТС]
BRcr, весь код то зачем?
В самом цикле : если переменная==с то заменяет на s
и так далее.
А вне цикла задаются переменные типа стринг ну и других типов.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
22.06.2013, 01:05
Человеческий фактор. Косяк может быть в действиях в любом месте метода Execute(). Автору кода как правило труднее заметить свои оплошности, чем постороннему человеку - это проверено многократно, можешь мне поверить.

А так-то, дело хозяйское, не хочешь - не надо; может, кто и захочет в угадайки поиграть...
1
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
25.06.2013, 09:19
Цитата Сообщение от BRcr Посмотреть сообщение
может, кто и захочет в угадайки поиграть...
Это я!
Итак.
Делай раз:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Memo2->Clear();
 Form1->o = 0;
 String NameThr;
 
 int count( StrToInt( Edit2->Text ) ); // Количество потоков
 TMyThread **Thr = new TMyThread *[count];
 for( int i = 0; i < count; ++i )
 {
   NameThr = "Thr"+(String)i;
   Thr[i] = new TMyThread(true, NameThr);
   Thr[i]->Priority = tpLower;
   Thr[i]->FreeOnTerminate = true;
   Thr[i]->Resume( );
   Application->ProcessMessages();
  }
}
Делай два:
C++
1
2
3
4
5
6
7
8
9
class TMyThread : public TThread
{
private:
        String Name;
protected:
        void __fastcall Execute();
public:
        __fastcall TMyThread(bool CreateSuspended, String Name);
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
__fastcall TMyThread::TMyThread(bool CreateSuspended, String NameThr)
        : TThread(CreateSuspended)
{
this->Name = NameThr;
}
//---------------------------------------------------------------------------
void __fastcall TMyThread::Execute()
{
  while(Form1->o<Form1->Memo1->Lines->Count)
  {
  Form1->Memo1->Lines->Strings[Form1->o] =
      Form1->Memo1->Lines->Strings[Form1->o]+":"+(String)Form1->o;
 
  Form1->Memo2->Lines->Add(this->Name);
  Form1->o++;
  }
}

И без синхронизации мы видим, что все потоки работают (точнее кто успел), но в целом полная жопа. Х)))
На этом мои телепатические способности заканчиваются и я таю.
1
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
25.06.2013, 09:35
Вот так работает:
Unit1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TButton *Button1;
        TEdit *Edit1;
        TMemo *Memo1;
        TButton *Button2;
        TEdit *Edit2;
        TMemo *Memo2;
        TLabel *Label1;
        TLabel *Label2;
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall Button2Click(TObject *Sender);
private:    // User declarations
public:     // User declarations
        __fastcall TForm1(TComponent* Owner);
        int o;
        CRITICAL_SECTION CS;
};
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
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
InitializeCriticalSection(&CS);
}//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Memo2->Clear();
 Form1->o = 0;
 String NameThr;
 
 int count( StrToInt( Edit2->Text ) ); // Количество потоков
 TMyThread **Thr = new TMyThread *[count];
 for( int i = 0; i < count; ++i )
 {
   NameThr = "Thr"+(String)i;
   Thr[i] = new TMyThread(true, NameThr);
   Thr[i]->Priority = tpLower;
   Thr[i]->FreeOnTerminate = true;
   Thr[i]->Resume( );
   Application->ProcessMessages();
  }
}


Unit2
C++
1
2
3
4
5
6
7
8
9
class TMyThread : public TThread
{
private:
        String Name;
protected:
        void __fastcall Execute();
public:
        __fastcall TMyThread(bool CreateSuspended, String Name);
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
__fastcall TMyThread::TMyThread(bool CreateSuspended, String NameThr)
        : TThread(CreateSuspended)
{
this->Name = NameThr;
}
//---------------------------------------------------------------------------
void __fastcall TMyThread::Execute()
{
 while(Form1->o<Form1->Memo1->Lines->Count)
  {
  EnterCriticalSection(&Form1->CS);
  Form1->Memo1->Lines->Strings[Form1->o] =
      Form1->Memo1->Lines->Strings[Form1->o]+":"+(String)Form1->o;
 
  Form1->Memo2->Lines->Add(this->Name);
 
 
  Form1->o++;
  LeaveCriticalSection(&Form1->CS);
  
}
1
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
25.06.2013, 09:44
И вот это я бы еще закинул в конструктор потока. Чтобы разгрузить код основного.
C++
1
2
3
4
5
6
7
__fastcall TMyThread::TMyThread(bool CreateSuspended, String NameThr)
        : TThread(CreateSuspended)
{
this->Name = NameThr;
this->Priority = tpLower;
this->FreeOnTerminate = true;
}
Хотя при этом читабельность основного потока снизится.

И да, картинка вот для ленивых:
1
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
25.06.2013, 22:08
Крит-секция в данном случае будет работать до поры, до времени. Внутренним процессам компонентов VCL эта крит-секция до лампочки, так что глюки на большом масштабе времени будут. Самый безопасный способ - дублированная информация для обработки в потоках и Syncyronize() или сообщения для публикации результатов.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
26.06.2013, 08:32
Цитата Сообщение от BRcr Посмотреть сообщение
дублированная информация для обработки в потоках и Syncyronize() или сообщения для публикации результатов
У нас одна глобальная переменная и куча VCL-евских компонентов. Как это разделить? Продублировать глобальную переменную это по моему бред. А запихнув все обращения к VCL в Synchronize мы добьемся лишь того, что один поток все и заграбастает. Или как?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.06.2013, 08:32

Многопоточность - правильное завершение потоков
Вот первый вопрос: 1) Как завершить заданное количество потоков. Pars - это потомок класса TThread Pars *Thr; - задано глобально. ...

Создать динамический массив книг
На экзамене задали создать программу вот её условие. Создать класс, в котором определить поля тематика, наименование, автор, год выпуска,...

Создать динамический массив из чисел, расположенных после первого отрицательного числа
Добрый день! Есть задание: создать динамический массив из чисел Мемо, расположенных после первого отрицательного числа ...... и т.д. У...

О потоках std::thread: можно ли вложить потоки друг в друга и можно ли создать динамический массив потоков?
1) Могу ли я вложить потоки друг в друга? 2) Могу ли я создать динамический массив потоков, каким-либо образом инициализировав их потом в...

Как создать динамический массив типа string? Как создать класс такого массива?
Как создать динамический массив типа string? Как создать класс такого массива? =-O Помогите, пожалуйста, очень нужна помощь!


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

Или воспользуйтесь поиском по форуму:
56
Ответ Создать тему
Новые блоги и статьи
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru