Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Многопоточное приложение


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

Создал форму, создал 3 потока. Во втором и третьем потоке написал код для задания В и С(кстати проверьте что не так). В первом потоке написал код массива. 

Код


#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

Код

#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}


Юнит первого потока
Код


#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

Код

#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]));
            }
}


Юнит второго потока
Код


#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

Код


#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 потока
Код


#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

Код


#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?
Заранее спасибо.

Автор: 123lexx321 21.3.2011, 10:06
Что совсем некому помочь?
Ну да ладно. Как создать потоки я разобрался. Теперь такой вопрос как элементы массива создаваемые  в первом потоке можно использовать во втором и третьем?

Автор: Dem_max 22.3.2011, 06:44
Цитата

Теперь такой вопрос как элементы массива создаваемые  в первом потоке можно использовать во втором и третьем?

ну это тебе решать как ты этот массив будешь использовать, по мне так не использовать вообще и радоваться жизни

Автор: ZVano 22.3.2011, 10:06
Разработка многопоточных приложений в C++Builder
http://www.rxlib.ru/WinLesson/bles2_1.htm

Автор: 123lexx321 22.3.2011, 11:47
Спасибо всем за помощь.... Особенно Dem_max. Но всё таки я её сделал

Автор: Alca 22.3.2011, 12:19
Петрович рулит http://forum.vingrad.ru/forum/topic-60076/view-all.html

Автор: _Dimon_ 24.3.2011, 02:25
Цитата(123lexx321 @ 22.3.2011,  11:47)
Спасибо всем за помощь.... Особенно Dem_max. Но всё таки я её сделал

Так дал бы всем нам готовое решение, посмотрели бы ....

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)