Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.64/22: Рейтинг темы: голосов - 22, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 22.01.2011
Сообщений: 25
1

Многопоточное приложение

20.03.2011, 09:42. Показов 4125. Ответов 31
Метки нет (Все метки)

Совсем запарился, помогите.
Задание:
Разработать программу, которая создает в отдельном потоке случайный массив А из N целых чисел в диапазоне от -999 до 999 выводит на экран эти числа. Создание и вывод элементов массива производится через заданное время T, N и T вводятся пользователем до запуска процесса. Массив обрабатывается двумя другими потоками В и С, работающими параллельно с потоком, создающим массив. Все потоки выводят результаты своей работы в текстовые окна, каждый поток в свое окно.
Задание В. Вычисление общего количества цифр всех элементов массива
Задание C. Определение и вывод чисел, являющихся простыми числами.

Создал форму, создал 3 потока. Во втором и третьем потоке написал код для задания В и С(кстати проверьте что не так). В первом потоке написал код массива.
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
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TButton *Button1;
        TButton *Button2;
        TMemo *Memo1;
        TMemo *Memo2;
        TMemo *Memo3;
        TTimer *Timer1;
        TLabel *Label1;
        TLabel *Label2;
        TLabel *Label3;
        TEdit *Edit1;
        TEdit *Edit2;
        TLabel *Label4;
        TLabel *Label5;
        void __fastcall Button1Click(TObject *Sender);
private:    // User declarations
        
public:     // User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
Юнит первого потока
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <Classes.hpp>
//---------------------------------------------------------------------------
class MyThr1 : public TThread
{            
private:
protected:
        void __fastcall Execute();
public:
        int i;
        char A[]="";
        __fastcall MyThr1(bool CreateSuspended);
};
//---------------------------------------------------------------------------
#endif
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <vcl.h>
#pragma hdrstop
 
#include "Unit2.h"
#pragma package(smart_init)
 
//---------------------------------------------------------------------------
 
__fastcall MyThr1::MyThr1(bool CreateSuspended)
        : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall MyThr1::Execute()
{
    Form1->Memo1->Text=StrToInt(Form1->Edit2->Text)+"случайных значений";
        for(i=0;i<Form1->Edit2->Text;i++)
            {
              A[i]= random(1999)-1000;
              Form1->Memo1->Lines->Add(IntToStr(A[i]));
            }
}
Юнит второго потока
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef Unit3H
#define Unit3H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Unit2.cpp>
 
//---------------------------------------------------------------------------
class MyThr2 : public TThread
{            
private:
protected:
        void __fastcall Execute();
public:
        __fastcall MyThr2(bool CreateSuspended);
};
//---------------------------------------------------------------------------
#endif
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
#include <vcl.h>
#pragma hdrstop
 
#include "Unit3.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
 
//   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 MyThr2::UpdateCaption()
//      {
//        Form1->Caption = "Updated in a thread";
//      }
//---------------------------------------------------------------------------
 
__fastcall MyThr2::MyThr2(bool CreateSuspended)
        : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall MyThr2::Execute()
{
        //---- Place thread code here ----
             while (A[i]>0)
               {
               A[i]/=10;
               count++;
               }
        Form1->Memo3->Text="Вычисление общего количества цифр всех элементов массива"+count;
}
Юнит 3 потока
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef Unit4H
#define Unit4H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Unit2.cpp>
 
//---------------------------------------------------------------------------
class MyThr3 : public TThread
{            
private:
protected:
        void __fastcall Execute();
public:
        __fastcall MyThr3(bool CreateSuspended);
};
//---------------------------------------------------------------------------
#endif
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
#include <vcl.h>
#pragma hdrstop
 
#include "Unit4.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
 
__fastcall MyThr3::MyThr3(bool CreateSuspended)
        : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall MyThr3::Execute()
{
        //---- Place thread code here ----
        Form1->Memo3->Text="Опеределение и вывод чисел, являющихся простыми";
        bool flag=1;
        for (int j=2;i<A[i];j++)
            {
            if (A[i]%j==0){flag=0;break;}
            }
        if (flag) Form1->Memo3->Lines->Add(IntToStr(A[i]));
 
}
А дальше начались проблемы.
1.Не знаю точно в правильном ли месте написал код массива, чтоб к нему могли обращаться все потоки?
2.Создал две кнопки START и STOP для запуска и остановки потоков. Подскажите где и как написать код для этих кнопок? И как использовать параметр T?
Заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.03.2011, 09:42
Ответы с готовыми решениями:

Многопоточное приложение
Добрый день. Интересует вопрос насколько правильно будет использование в С++ Builder компонента...

Многопоточное програмирование
здрасвуйте))) обращаюсь к вам, так как знаю, что люди которые общаются на етом форуме понимают своё...

Многопоточное приложение
Возник вопрос по поводу работы с паралельно запускающимися потоками. Есть ли метод который бы четко...

Многопоточное приложение
Помогите пожалуйста реалзовать данное приложение в консоли VS C++ . Просто не понимаю принцыпы...

31
0 / 0 / 0
Регистрация: 22.01.2011
Сообщений: 25
21.03.2011, 10:05  [ТС] 2
Что совсем некому помочь?
Ну да ладно. Как создать потоки я разобрался. Теперь такой вопрос как элементы массива создаваемые в первом потоке можно использовать во втором и третьем?
0
103 / 74 / 10
Регистрация: 29.05.2010
Сообщений: 192
21.03.2011, 10:29 3
ну видимо надо объявить массив глобально, или передавать в потоки указатель на него. Тока синхронизацию надо
0
0 / 0 / 0
Регистрация: 22.01.2011
Сообщений: 25
21.03.2011, 10:54  [ТС] 4
У меня массив объявляется в первом потоке. Со ссылками запутался, не могли бы привести пример. И про синхронизации поподробне что с чем синхронизировать
0
1115 / 786 / 100
Регистрация: 01.02.2011
Сообщений: 1,847
Записей в блоге: 1
21.03.2011, 11:17 5
Если, например, в Unit1.cpp объявлена переменная:
bool bIsGood;
то чтобы к ней обратиться из другого юнита, нужно, в Unit2.h добавить:
extern bool bIsGood;

как-то так
0
0 / 0 / 0
Регистрация: 22.01.2011
Сообщений: 25
21.03.2011, 11:26  [ТС] 6
При компиляции получается Unresolved external '_A' reverenced ferom C:\.....unit3.obj
0
103 / 74 / 10
Регистрация: 29.05.2010
Сообщений: 192
21.03.2011, 11:29 7
Код
class MyThr1 : public TThread
{            
private:
protected:
        void __fastcall Execute();
public:
        int i;
        char *A;
        __fastcall MyThr1(bool CreateSuspended, char* Mas);
};

__fastcall MyThr1::MyThr1(bool CreateSuspended)
        : TThread(CreateSuspended)
{
  A = Mas;
}
ну и так каждый поток объявить. Глобально объявить char *Mas. Вызывать потоки
MyThr1(bool CreateSuspended, Mas);
После этого в каждом потоке будет доступен указатель на общий массив.

А синхронизация нужна если несколько потоков пишут в одну переменную. Делается синхронизация с помощью мютексов, семафоров, крит секций и тд. - гугл в помощь
0
0 / 0 / 0
Регистрация: 22.01.2011
Сообщений: 25
21.03.2011, 11:46  [ТС] 8
Сделал.ю выдаёт Could not find a match for 'MyThr1::MyThr1(bool)'
0
103 / 74 / 10
Регистрация: 29.05.2010
Сообщений: 192
21.03.2011, 11:51 9
мой касяк

__fastcall MyThr1::MyThr1(bool CreateSuspended, char *Mas)
: TThread(CreateSuspended)
{
A = Mas;
}
0
0 / 0 / 0
Регистрация: 22.01.2011
Сообщений: 25
21.03.2011, 11:57  [ТС] 10
Цитата Сообщение от -LeV- Посмотреть сообщение
Вызывать потоки
MyThr1(bool CreateSuspended, Mas);
После этого в каждом потоке будет доступен указатель на общий массив.
С этим не понял. Я потоки вызываю
Thr1=new MyThr1(false);

Или мы про разные вещи?

Кстати предыдущая ошибка осталась и указывает как раз на false в предыдущей записи
0
103 / 74 / 10
Регистрация: 29.05.2010
Сообщений: 192
21.03.2011, 12:02 11
ну а теперь надо вызывать Thr1=new MyThr1(false, Mas); где Mas - указатель на общий массив
0
0 / 0 / 0
Регистрация: 22.01.2011
Сообщений: 25
21.03.2011, 12:22  [ТС] 12
Цитата Сообщение от -LeV- Посмотреть сообщение
ну а теперь надо вызывать Thr1=new MyThr1(false, Mas); где Mas - указатель на общий массив
А к потоку в котором этот массив создается это тоже пишется?
У меня 1 юнит формы в котором запускается поток, 2 юнит в котором создается массив, а остальные два юнита производят действия с элементами массива.
Сейчас запустил, форма открылась, ввёл N, при запуске первого потока отладчик заругался Project1 raised exception class....
0
103 / 74 / 10
Регистрация: 29.05.2010
Сообщений: 192
21.03.2011, 12:30 13
да, ко всем потокам
ну надо создавать массив раньше чем его использовать
0
0 / 0 / 0
Регистрация: 22.01.2011
Сообщений: 25
21.03.2011, 12:38  [ТС] 14
и когда компилирует выдает public symbol defined in both module с:\....unit1.obj and c:\....unit1.obj

Добавлено через 1 минуту
на этот кусок A[i]=random(1999)-1000;
0
103 / 74 / 10
Регистрация: 29.05.2010
Сообщений: 192
21.03.2011, 12:43 15
значит два раза объявлена переменная, выложите код
0
0 / 0 / 0
Регистрация: 22.01.2011
Сообщений: 25
21.03.2011, 12:50  [ТС] 16
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
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TButton *Button1;
        TButton *Button2;
        TMemo *Memo1;
        TMemo *Memo2;
        TMemo *Memo3;
        TTimer *Timer1;
        TLabel *Label1;
        TLabel *Label2;
        TLabel *Label3;
        TEdit *Edit1;
        TEdit *Edit2;
        TLabel *Label4;
        TLabel *Label5;
        void __fastcall Button1Click(TObject *Sender);
private:    // User declarations
 
 
public:     // User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
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
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
#include "Unit2.h"
 
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
MyThr1 *Thr1;
int*Mas;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Thr1=new MyThr1(false,Mas);
Thr1->FreeOnTerminate=true;
}
unit2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <Classes.hpp>
//---------------------------------------------------------------------------
class MyThr1 : public TThread
{            
private:
 
protected:
        void __fastcall Execute();
public:
        int i;
        int *A;
        __fastcall MyThr1(bool CreateSuspended,int*Mas);
};
//---------------------------------------------------------------------------
#endif
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
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
#include "Unit1.h"
#include "Unit3.h"
#include "Unit4.h"
#pragma package(smart_init)
 
extern MyThr1 *Thr1;
int*Mas;
MyThr2 *Thr2;
MyThr3 *Thr3;
__fastcall MyThr1::MyThr1(bool CreateSuspended,int*Mas)
        : TThread(CreateSuspended)
{
Mas=A;
}
//---------------------------------------------------------------------------
void __fastcall MyThr1::Execute()
{
    Form1->Memo1->Text=Form1->Edit2->Text+" случайных значений";
            for(i=0;i<StrToInt(Form1->Edit2->Text);i++)
            {
              A[i]=random(1999)-1000;
              Form1->Memo1->Lines->Add(A[i]);
            }
     Thr2=new MyThr2(false);
     Thr2->FreeOnTerminate=true;
     Thr3=new MyThr3(false);
     Thr3->FreeOnTerminate=true;
     delete Thr1;
unit3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef Unit3H
#define Unit3H
//---------------------------------------------------------------------------
#include <Classes.hpp>
 
 
//---------------------------------------------------------------------------
class MyThr2 : public TThread
{            
private:
         
protected:
        void __fastcall Execute();
public:
        __fastcall MyThr2(bool CreateSuspended);
};
//---------------------------------------------------------------------------
#endif
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <vcl.h>
#pragma hdrstop
#include "Unit3.h"
#include "Unit1.h"
#include "Unit2.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
 
//---------------------------------------------------------------------------
extern MyThr2 *Thr2;
 
__fastcall MyThr2::MyThr2(bool CreateSuspended)
        : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall MyThr2::Execute()
{
        //---- Place thread code here ----
        Form1->Memo2->Text="Общее количество цифр всех элементов массива";
        delete Thr2;
}
unit4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifndef Unit4H
#define Unit4H
//---------------------------------------------------------------------------
#include <Classes.hpp>
 
//---------------------------------------------------------------------------
class MyThr3 : public TThread
{            
private:
protected:
        void __fastcall Execute();
public:
        __fastcall MyThr3(bool CreateSuspended);
};
//---------------------------------------------------------------------------
#endif
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <vcl.h>
#pragma hdrstop
#include "Unit4.h"
#include "Unit1.h"
#include "Unit2.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
 
extern MyThr3 *Thr3;
__fastcall MyThr3::MyThr3(bool CreateSuspended)
        : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall MyThr3::Execute()
{
        //---- Place thread code here ----
        Form1->Memo3->Text="Опеределение и вывод чисел, являющихся простыми";
        delete Thr3;
 }
0
103 / 74 / 10
Регистрация: 29.05.2010
Сообщений: 192
21.03.2011, 12:56 17
Mas объявлена в unit1 и в unit2, где то надо поставить extern или объявлять ее в общем заголовочном файле
0
0 / 0 / 0
Регистрация: 22.01.2011
Сообщений: 25
21.03.2011, 13:02  [ТС] 18
А что не так в коде заполняющем массив? Не компилируется,выдает Project1 raised exception class.... и укзывает на A[i]=random(1999)-1000;
0
103 / 74 / 10
Регистрация: 29.05.2010
Сообщений: 192
21.03.2011, 13:07 19
ну блин, надо сначала же память выделить прежде чем заполнять
A = new char[столько_сколько_надо_элементов];

а когда массив будет не нужен удалить
delete[] Mas;
0
0 / 0 / 0
Регистрация: 22.01.2011
Сообщений: 25
21.03.2011, 13:12  [ТС] 20
Спасибо за помощь. Понимаю что уже достал...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.03.2011, 13:12

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Многопоточное приложение
Требуется разработать многопоточное приложение (в качестве средства разработки следует использовать...

Многопоточное приложение на C#
помогите пожааалуйста написать многопоточное приложение на C#.Создать игру, где будут 2-3 барана и...

Многопоточное приложение
Есть класс. В нем 2 функции. как в одной функции можно создать 2 потока выполняющую одну и туже...

Многопоточное приложение
Доброго! Вот и моя очередь пришла просить помощи, не хватает моих знаний. Есть программа для...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.