Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как создать ThreadForm  (Прочитано 10648 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Serg76
Гость
« : 13-04-2007 14:08 » 

подскажите пожалуста.

пытаюсь сам учить c++ builder 6
написал программу для копирования файлов по сетке, но винда её вырубает(в пошаговом режиме работает без ошибок)

появилась необходимость разобраться с потоками, нашёл в книге
Джаррод Холингворт и др. "Borland C++ Builder 6"
создание TRandomThread через File->New->Thread Object, но там не понятно как создать ThreadForm
хотя во всех примерах она используется.

подскажите или может где то есть толковые книги для начинающих
Записан
Serg76
Гость
« Ответ #1 : 25-04-2007 13:31 » 

неужели ни кто не в builder не работал с потоками Не понял
может есть другой вариант? Здесь была моя ладья...
Записан
kroum
Интересующийся

ua
Offline Offline

« Ответ #2 : 25-04-2007 15:26 » 

Поток - это поток. Форма - это форма. Класс формы ты можешь обозвать хоть TThreadForm, хоть TForm1 (в инспекторе объектов, если форму создаешь через File->New->Form, названия, соответственно, будут ThreadForm, Form1).
В примерах так называют, чтобы было понятно: этот класс (форма) работает с потоками.
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #3 : 26-04-2007 05:06 » 

Я работал, когда-то в билдере с потоками, обысно достаточно унаследоватся от некоторого TThread(или как его там) и описать Execute(или как он там)

Сейчас использую потоки, только через boost::thread потому, что удобно и работает одинаково и в Linux и Windows.
Чего и вам советую.
Если изнутри потока захочется обновлять какие-то объекты GUI, то не забывай, что нужно перед обновлением вызывать методы синхронизации GUI, иначе будут всякие проблемы с отрисовкой обновлённых данных
Записан

Странно всё это....
Serg76
Гость
« Ответ #4 : 26-04-2007 09:54 » 

Поток - это поток. Форма - это форма. Класс формы ты можешь обозвать хоть TThreadForm, хоть TForm1 (в инспекторе объектов, если форму создаешь через File->New->Form, названия, соответственно, будут ThreadForm, Form1).
В примерах так называют, чтобы было понятно: этот класс (форма) работает с потоками.


Когда выбираю File->New->Thread Object создаётся только unit.cpp, форма не создаётся А черт его знает...
Если выбираю File->New->Form создаётся уже Form2, получается что Form1(ThreadForm) уже есть но где Здесь была моя ладья...

Записан
kroum
Интересующийся

ua
Offline Offline

« Ответ #5 : 26-04-2007 12:00 » 

получается что Form1(ThreadForm) уже есть но где Здесь была моя ладья...
Как только открывается Builder автоматически создается форма, по умолчанию она называется "Form1"

Попробую сказать по другому.
Объект формы и объект потока - совершенно отдельные вещи. Нельзя с помощью wizard'ов, встроенных в интерфейс Builder'а,  создать "потоковую форму". Можно создать отдельно форму. Отдельно поток. Описать, чего хочешь от потока. И потом сказать где-нибудь в функциях созданной формы (явно сказать, ручками), что ты хочешь создать экземпляр описанного тобой потока, и правила, когда его запускать, и когда остановить.

Еще раз повторюсь.
Форма и поток - суть разные вещи. И работать с ними нужно по разному.
Записан
Serg76
Гость
« Ответ #6 : 18-05-2007 10:44 » 

to LogRus
Цитата
Сейчас использую потоки, только через boost::thread потому, что удобно и работает одинаково и в Linux и Windows.
Чего и вам советую.
можно ссылки на документацию



может с этого надо было сразу начать

кагда открываю .bpr всё работает, но сделать его как новое приложение никак Не понял
вставляю код из примера - объясните КАК ТУТ СОЗДАЁТСЯ ThreadForm
 А черт его знает...

ThreadFormUnit.h
Код:
#ifndef ThreadFormUnitH
#define ThreadFormUnitH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TThreadForm : public TForm
{
__published: // IDE-managed Components
   TButton *Start;
   TButton *Stop;
   void __fastcall StartClick(TObject *Sender);
   void __fastcall StopClick(TObject *Sender);
private: // User declarations
public: // User declarations
   __fastcall TThreadForm(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TThreadForm *ThreadForm;
//---------------------------------------------------------------------------
#endif

ThreadFormUnit.cpp
Код:
#include <vcl.h>
#pragma hdrstop

#include "ThreadFormUnit.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("Error! Cannot create thread.");
      Application->Terminate();
   }
}

void __fastcall TThreadForm::StartClick(TObject *)
{
   ResumeThread(Thread);
   Start->Enabled = false;
   Stop->Enabled = true;
}

void __fastcall TThreadForm::StopClick(TObject *)
{
   SuspendThread(Thread);
   Stop->Enabled = false;
   Start->Enabled = true;
}
Записан
kroum
Интересующийся

ua
Offline Offline

« Ответ #7 : 18-05-2007 11:15 » 

КАК ТУТ СОЗДАЁТСЯ ThreadForm

Тут не создается. Только описывается.

Смотри меню View->Project Source. Это, собственно, начало. Здесь создаются (инициализируются) все формы, которые должны создаваться при старте приложения.

Если здесь не найдешь, шерсти все *.cpp в папке с проектом на наличие подстроки
new TThreadForm(
Записан
Serg76
Гость
« Ответ #8 : 18-05-2007 12:15 » 

Тут не создается. Только описывается.

Смотри меню View->Project Source. Это, собственно, начало. Здесь создаются (инициализируются) все формы, которые должны создаваться при старте приложения.

Если здесь не найдешь, шерсти все *.cpp в папке с проектом на наличие подстроки
new TThreadForm(



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

попытался создать File->New->Thread Object и дописать
Application->CreateForm(__classid(TThreadForm), &ThreadForm); как в примере
но в новом проекте опция View Source не активна Здесь была моя ладья...

можно по конкретней куда, что вписать что бы инициализировать TThreadForm
Записан
kroum
Интересующийся

ua
Offline Offline

« Ответ #9 : 18-05-2007 13:43 » 

Я, кажется, понял.

У тебя есть книга, но нет споровождающего CD-ROM.

Тогда последовательность действий следующая.

1. Запускаешь CBuilder. Первое, что ты видишь - это форма.
2. Жмешь F11. Появляется Object inspector. В нем, в поле "Name" набираешь ThreadForm
3. Сохраняешь проект. Когда спросит, под каким именем сохранить unit1.cpp, обзываешь его ThreadFormUnit.cpp. Проект (Project1.bpr) можешь назвать как заблагорассудится.
4. Помещаешь на форму две кнопки (из вкладки компонентов Standard). В Object inspector "Name" одной устанавливаешь Start, "Name" другой - Stop.
5. Сохранить проект.
5. Дважды щелкаешь по кнопке Start. Возвращаешься в конструктор формы (чтобы на экране был не код, а форма)
6. Дважды щелкаешь по кнопке Stop.
7. Копируешь целиком приведенный тобой листинг ThreadFormUnit.cpp
8. Сохраняешь проект.

Форма ThreadForm создана.

Дальше - File->New->Thread Object, и по тексту книги
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines