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


Автор: Golovastik 2.10.2009, 20:18
Начал изучать потоки в С++ Билдере 6. Вот по книге в качестве примера с потоками набрал код, но программа не компилится, не знаю что делать.


M
dumb
Golovastik, текст сообщений об ошибках прилагай. так же неплохо их самому пытаться прочитать и осмыслить.


Код



//---------------------------------------------------------------------------

#include <vcl.h>
#include <windows.h>
#include "ThreadFormUnit.h"
#pragma hdrstop

#include "Unit1.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
    TThreadForm *ThreadForm;
    HANDLE Thread;

    DWORD WINAPI ThreadFunc(LPVOID Param)
    {
       HANDLE MAinWnd(Param);

       RECT R;
       GetClientRect(MainWnd, &R);

       const MaxWidth = R.right - R.left;
       const MaxHeight = R.bottom - R.top;
       int X1,Y1,X2,Y2,R1,G1,B1;
       bool IsEllipse;
       while(true)
       {
          HDC DC = GetDC(MainWnd);

          X1 = rand() % MaxWidth;
          Y1 = rand() % MaxHeight;
          X2 = rand() % MaxWidth;
          Y2 = rand() % MaxHeight;

          R1 = rand() & 255;
          G1 = rand() & 255;
          B1 = rand() & 255;
          IsEllipce = rand() & 1;

          HBRUSH Brush = CreateSolidBrush(RGB(R1,G1,B1));
          SelectObject(DC, Brush);

          if(IsEllipse)
          Ellipse(DC,X1,Y1,X2,Y2);
          else
          Rectangle(DC,X1,Y1,X2,Y2);

          ReleaseDC(MainWnd,DC);
          DeleteIbject(Brush);
       }
    }
__fastcall
TThreadForm::TThreadForm(TComponent *Owner) : TForm(Owner)
 {
     randomize();
     DWORD Id;
     Thread = CreateThread(0,0,ThreadFunc,
     ThreadForm->Handle, CREATE_SUSPENDED, &Id);

     if(!Thread)
     {
        ShowMessage("Невозможно создать Thread");
        Application->Terminate();
     }
 }
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ResumeThread(Thread);
Button1->Enabled = false;
Button1->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    Suspended->Thread(Thread);
  Button2->Enabled = false;
  Button2->Enabled = true;
}
//---------------------------------------------------------------------------

Автор: SVN74 2.10.2009, 23:17
Цитата(Golovastik @  2.10.2009,  20:18 Найти цитируемый пост)
HANDLE MAinWnd(Param);

Тут явно ошибка...

Автор: Golovastik 3.10.2009, 19:58
При компиляции программа, останавливается на первой строке
Код

 TThreadForm *ThreadForm;

Declaration syntax error

Вроде правильно,как в книге, но код не работает.

Автор: dumb 4.10.2009, 04:07
содержимое файла ThreadFormUnit.h показывай

Автор: Anikmar 4.10.2009, 16:39
Цитата(Golovastik @  3.10.2009,  19:58 Найти цитируемый пост)
TThreadForm *ThreadForm;

В примере форма так названа, у вас 

Цитата(Golovastik @  2.10.2009,  20:18 Найти цитируемый пост)
TForm1 *Form1;


Не надо копипастить все без разбора.

Автор: Golovastik 4.10.2009, 19:27
Нет, в примере только,то что я скинул, такого:
Код

TForm1 *Form1;

там нету.
И содержимое ThreadFormUnit.h, проверял несколько раз, там нету, просто в программе, подключен файл  ThreadFormUnit.h.
Ошибка на том же месте.
Declaration syntax error

Вот ссылка,от куда пробывал писать по многопоточности:
Код

http://books.google.ru/books?id=bk2oFiI4PzQC&pg=PT100&lpg=PT100&dq=Многопоточность+на+С%2B%2B+Билдер&source=bl&ots=nI3hr90bTY&sig=vMshBOsfpzC134mHJsDsDmS0zW0&hl=ru&ei=_QfGSvyDCI2CnQOwhfFE&sa=X&oi=book_result&ct=result&resnum=7#v=onepage&q=%D0%9C%D0%BD%D0%BE%D0%B3%D0%BE%D0%BF%D0%BE%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D1%81%D1%82%D1%8C&f=false

179 - 180 страница.

Автор: Golovastik 4.10.2009, 21:24
Наконец-то заработало, нужно было вот так:
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include <windows.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"


 TThreadForm *ThreadForm;
    HANDLE Thread;

    DWORD WINAPI ThreadFunc(LPVOID Param)
    {
       HANDLE MainWnd(Param);

       RECT R;
       GetClientRect(MainWnd, &R);

       const MaxWidth = R.right - R.left;
       const MaxHeight = R.bottom - R.top;
       int X1,Y1,X2,Y2,R1,G1,B1;
       bool IsEllipse;
       while(true)
       {
          HDC DC = GetDC(MainWnd);

          X1 = rand() % MaxWidth;
          Y1 = rand() % MaxHeight;
          X2 = rand() % MaxWidth;
          Y2 = rand() % MaxHeight;

          R1 = rand() & 255;
          G1 = rand() & 255;
          B1 = rand() & 255;
          IsEllipse = rand() & 1;

          HBRUSH Brush = CreateSolidBrush(RGB(R1,G1,B1));
          SelectObject(DC, Brush);

          if(IsEllipse)
          Ellipse(DC,X1,Y1,X2,Y2);
          else
          Rectangle(DC,X1,Y1,X2,Y2);

          ReleaseDC(MainWnd,DC);
          DeleteObject(Brush);
       }
    }
__fastcall
TThreadForm::TThreadForm(TComponent *Owner) : TForm(Owner)
 {
     randomize();
     DWORD Id;
     Thread = CreateThread(0,0,ThreadFunc,
     ThreadForm->Handle, CREATE_SUSPENDED, &Id);

     if(!Thread)
     {
        ShowMessage("Невозможно создать Thread");
        Application->Terminate();
     }
 }

void __fastcall TThreadForm::Button1Click(TObject *Sender)
{
ResumeThread(Thread);
Button1->Enabled = false;
Button2->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TThreadForm::Button2Click(TObject *Sender)
{
 SuspendThread(Thread);
  Button2->Enabled = false;
  Button1->Enabled = true;
}
//---------------------------------------------------------------------------

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