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

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

04.04.2013, 23:36. Показов 11778. Ответов 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
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
19.04.2013, 19:46
Студворк — интернет-сервис помощи студентам
Gdasar, ну, тогда у тебя примерно два пути: продолжать и дальше сокрушаться по поводу неспособности осознавать текст ошибки или все-таки научиться по сообщениям понимать, в чем может быть причина ошибки, а в чем не может. Естественно, описания всех ошибок в справке есть.
1
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
23.04.2013, 21:55  [ТС]
Вылетает ошибка:
HTML5
1
[C++ Error] Unit1.cpp(24): E2248 Cannot find default constructor to initialize array element of type 'TMyThread'
Скажите,как мне инициализировать элементы массива.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
24.04.2013, 09:59
Похоже, конструктор в классе TMyThread не дописал. Показывай объявление этого класса.
0
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
24.04.2013, 11:48  [ТС]
Unit1.cpp
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
//---------------------------------------------------------------------------
 
#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;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 int i;
 TMyThread *Thr = new TMyThread[StrToInt(Edit3->Text)];
 for(i=0;i<StrToInt(Edit3->Text);i++)
 {
  Thr= new TMyThread(true);
  Thr->Priority=tpLower;
  Thr->FreeOnTerminate=true;
  Thr->Resume();
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 InitializeCriticalSection(&cs);
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
 DeleteCriticalSection(&cs);
}
//---------------------------------------------------------------------------
Unit1.h
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
//---------------------------------------------------------------------------
 
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TButton *Button1;
        TMemo *Memo1;
        TEdit *Edit1;
        TEdit *Edit2;
        TEdit *Edit3;
        TMemo *Memo2;
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall FormCreate(TObject *Sender);
        void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
 
private:
public:     // User declarations
        __fastcall TForm1(TComponent* Owner);
       int o;
        CRITICAL_SECTION cs;
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Unit2.cpp
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#include <string.h>
 
#pragma hdrstop
 
#include "Unit2.h"
#include "Unit1.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
 
 
__fastcall TMyThread::TMyThread(bool CreateSuspended)
        : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall TMyThread::Execute()
{
 EnterCriticalSection(&Form1->cs);
 Synchronize(&MemoAdd);
 LeaveCriticalSection(&Form1->cs);
}
//---------------------------------------------------------------------------
void __fastcall TMyThread::MemoAdd()
{
.......
}
Unit2.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//---------------------------------------------------------------------------
 
#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <windows.h>
//---------------------------------------------------------------------------
class TMyThread : public TThread
{            
private:
protected:
        void __fastcall Execute();
        void __fastcall MemoAdd();
public:
           String N,mag;
        __fastcall TMyThread(bool CreateSuspended);
};
//---------------------------------------------------------------------------
#endif
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
24.04.2013, 13:30
C++
1
2
3
4
5
6
7
8
9
10
11
class TMyThread : public TThread
{            
private:
protected:
        void __fastcall Execute();
        void __fastcall MemoAdd();
public:
           String N,mag;
        __fastcall TMyThread( void ) : TThread( true ) {}
        __fastcall TMyThread( bool CreateSuspended ) : TThread( CreateSuspended ) {}
};
Добавлено через 4 минуты
Еще создание потоков неправильное.
C++
1
2
3
4
5
6
7
8
9
 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( );
  }
1
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
24.04.2013, 13:49  [ТС]
Если не писать вот это:
C++
1
2
        __fastcall TMyThread( void ) : TThread( true ) {}
        __fastcall TMyThread( bool CreateSuspended ) : TThread( CreateSuspended ) {}
То компилируется без ошибок.
С этим же выскакивает вот это:
HTML5
1
[C++ Error] Unit2.cpp(15): E2171 Body has already been defined for function '_fastcall TMyThread::TMyThread(bool)'
P.S.
__fastcall TMyThread::TMyThread(bool CreateSuspended)
: TThread(CreateSuspended)


Эта часть кода уже есть в Unit2.cpp
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
24.04.2013, 14:25
Цитата Сообщение от Gdasar Посмотреть сообщение
Если не писать вот это
Если не писать это, то вы сойдете с ума и все мы умрем не сможете создать экземпляр класса. Это два конструктора (по умолчанию и с параметром).
Только вот думаю надо скобочки фигурные пробовать убрать у обоих и списки параметров. Зачем в .h это?

.h:
C++
1
2
        __fastcall TMyThread( void );
        __fastcall TMyThread( bool CreateSuspended );

Цитата Сообщение от Gdasar Посмотреть сообщение
P.S.
__fastcall TMyThread::TMyThread(bool CreateSuspended)
: TThread(CreateSuspended)
Эта часть кода уже есть в Unit2.cpp
Ага. В .cpp лежит описание функции (чего она делает). А в .h объявление (что она вообще есть).

.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#pragma package(smart_init)
//---------------------------------------------------------------------------
__fastcall TMyThread::TMyThread()
        : TThread(true)
{
}
//---------------------------------------------------------------------------
__fastcall TMyThread::TMyThread(bool CreateSuspended)
        : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall TMyThread::Execute()
1
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
24.04.2013, 15:00
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Зачем в .h это?
Конструкторы пустые и, вероятнее всего, таковыми и останутся, поэтому и предложил определять их в объявлении класса, для простоты.
Цитата Сообщение от Gdasar Посмотреть сообщение
Body has already been defined for function '_fastcall TMyThread::TMyThread(bool)'
Эта часть кода уже есть в Unit2.cpp
Я думал, если честно, ты и сам догадаешься ее оттуда удалить. Раз уж она там до сих пор есть, то прими волевое решение - убрать определение функции либо из объявления класса, либо из модуля .cpp
1
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
26.04.2013, 00:55  [ТС]
Еще вопросик:
Как мне сделать так,чтобы программа производила парсинг в 10 потоков?
При создании 10 потоков,парсинг все равно происходит в один поток
C++
1
2
3
4
5
6
7
8
void __fastcall TMyThread::Execute()
 while(Form1->o<Form1->Memo1->Lines->Count)
 {
  Synchronize(&MemoAdd);
  Form1->o++;
 }
 LeaveCriticalSection(&Form1->cs);
}
Так же если парсеру подсунуть сотню тысяч ссылок для парсинга,то форма намертво виснет. Это происходит из-за того,что к мемо происходит большое количество обращений? Или из-за чего-то другого?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
27.04.2013, 13:41
Нельзя под Synchronize() помещать всю работу потока, это теряет всяческий смысл. Под него следует помещать лишь обращения в объектам VCL.
По обработке текста можешь тут глянуть - Поиск по условию в TStringList
0
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
27.04.2013, 16:52  [ТС]
А куда тогда девать остальной код?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
27.04.2013, 20:21
Остальной код остается внутри метода Execute() и работает в потоке. То, что закатывается под Synchronize(), работает не в данном потоке, а в главном потоке программы, вместе со всеми обработчиками событий - если туда сунуть, например, вечный цикл, программа совершенно естественным образом повиснет.
1
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
27.04.2013, 21:48  [ТС]
А если из мемо все поместить в СтрингЛист,то прога будет шустрее работать?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
27.04.2013, 23:11
Смотря, что нужно делать. Короче, обрисуй задачу - получишь пример проги, что будет шустрее работать.
0
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
29.04.2013, 00:06  [ТС]
Собственно вот сам код:

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
#include <vcl.h>
#include <string.h>
 
#pragma hdrstop
 
#include "Unit2.h"
#include "Unit1.h"
#pragma package(smart_init)
 String input,output,url; int b;
//---------------------------------------------------------------------------
__fastcall TMyThread::TMyThread()
        : TThread(true)
{
}
//---------------------------------------------------------------------------
__fastcall TMyThread::TMyThread(bool CreateSuspended)
        : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall TMyThread::Execute()
{
 
 b=0; input=(Form1->Edit1->Text); output=(Form1->Edit2->Text);
 EnterCriticalSection(&Form1->cs);
 while(Form1->o<Form1->Memo1->Lines->Count)
 {
  Synchronize(&MemoAdd);
  Form1->o++;
 }
 LeaveCriticalSection(&Form1->cs);
}
//---------------------------------------------------------------------------
void __fastcall TMyThread::MemoAdd()
{
  url=Form1->Memo1->Lines->Strings[Form1->o];
  url.Delete(url.Pos(input),input.Length()); //удаляем начальный префикс из строки
  b=(url.Pos(output)+output.Length())-1; //место вхождения второго префикса
  Form1->Memo1->Lines->Strings[Form1->o]=input+url.SubString(0,b);
  b=0;
}
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
29.04.2013, 09:04
Gdasar, я могу конечно ошибаться, но по моему использовать Synchronize внутри критической секции это не есть хорошо.
0
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
29.04.2013, 11:53  [ТС]
SatanaXIII, а как же тогда сделать,ведь CriticalSection обеспечивает мне поочередное взятие строчек из мемо(будет обеспечивать,когда я создам 10 потоков).
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
29.04.2013, 13:16
Можно все попробовать переложить на Synchronize. В случае с критическими секциями у нас система управляет доступом, она каждому потоку передает разрешение на модификацию секции. При использовании Synchronize у нас главный поток выдает разрешения дочерним. В данном случае поток формы и есть главный, плюсом в нем же находится и Memo, которое мы меняем. Так пусть он сам собой и управляет.
Вот вы пишите:
C++
1
2
3
void __fastcall TMyThread::Execute()
{
 b=0; input=(Form1->Edit1->Text); output=(Form1->Edit2->Text);
А потом уже входите в критическую секцию:
C++
1
EnterCriticalSection(&Form1->cs);
Но что будет, если у нас два потока одновременно сделают Execute()? Кому сначала отдать Edit1 и Edit2? Логика такова - они объекты VCL? VCL. Следовательно надо пихать их в Synchronize. Он для этого придуман, вот пусть он и разбирается. Такая же басня и с while-ом и с инкрементом о. Они прямо таки напрашиваются залезть в Synchronize. А запихав их туда дилемма с критическими секциями отпадет сама собой.
Конечно это все сильно нагрузит поток главной формы.
1
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
29.04.2013, 14:36  [ТС]
А как мне сделать так,что бы парсинг происходил в 10 потоков?
BRcr советовал весь код не связанный с мемо запихнуть в Execute .
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.04.2013, 14:54
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Gdasar, я могу конечно ошибаться, но по моему использовать Synchronize внутри критической секции это не есть хорошо.
Ну страшного ничЁ нет, но выглядит глупо, к тому же дедлоком попахивает учитывая неправильное использование секций.
Также же есть более оптимальный способ использовать вместо Synchronize(), TIdNotify
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.04.2013, 14:54

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru