Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> THREAD и глобальные переменные, Ипользовать функции и переменны в thread 
V
    Опции темы
dahilu
Дата 22.8.2012, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 9.9.2010

Репутация: нет
Всего: нет



Main.h
Код

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

#ifndef MainH
#define MainH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include "MyTHRD.h"
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TLabel *Label1;
        void __fastcall FormCreate(TObject *Sender);
private:    // User declarations
public:        // User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
int VarA;
void OutputVarA();
//---------------------------------------------------------------------------
#endif

Main.cpp
Код

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

#include <vcl.h>
#pragma hdrstop

#include "Main.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
MyTHRD *MyT;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{

}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
        MyT=new MyTHRD(false);
}
void OutputVarA()
{
        Form1->Label1->Caption=IntToStr(VarA);
}
//---------------------------------------------------------------------------


MyTHRD.h
Код

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

#ifndef MyTHRDH
#define MyTHRDH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include "Main.h"
//---------------------------------------------------------------------------
class MyTHRD : public TThread
{            
private:
protected:
        void __fastcall Execute();
        void __fastcall Output();
public:
        __fastcall MyTHRD(bool CreateSuspended);
};
extern int VarA;
//---------------------------------------------------------------------------
#endif


MyTHRD.cpp
Код

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

#include <vcl.h>
#pragma hdrstop
#pragma package(smart_init)
#include "MyTHRD.h"

__fastcall MyTHRD::MyTHRD(bool CreateSuspended)
        : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall MyTHRD::Execute()
{
        Output();
}
//---------------------------------------------------------------------------
void __fastcall MyTHRD::Output()
{
        VarA=22;
        OutputVarA();
}


Компилируется но выводит в Label1 0
выдает предупреждение что она объявлена в двух модулях:

Public symbol '_VarA' defined in both module C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\TESTTHREAD\MAIN.OBJ and C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\TESTTHREAD\MYTHRD.OBJ

Как убрать ошибку и как тогда обратится к VarA и OutputVarA(); из потока?

Почему если #include "MyTHRD.h" и MyTHRD *MyT; сделать в Main.h будет выдаваться ошибка [C++ Error] Main.h(24): E2141 Declaration syntax error?

PM MAIL   Вверх
borisbn
Дата 22.8.2012, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



1) В h-никах делают только объявление, а описание делают в cpp-шниках. Перенеси int VarA; в main.cpp, а в main.h сделай extern int VarA; (и в MyTHRD.h он уже не нужен.
2) К VCL-ным компонентам запрещено обращаться из доп.потоков, а ты это делаешь
Цитата(dahilu @  22.8.2012,  10:19 Найти цитируемый пост)
Form1->Label1->Caption=IntToStr(VarA);

для этого существует метод TThread::Synchronize()
3) (не в обиду) Рановато тебе заниматься потоками, если не умеешь объявлять и описывать переменные... ИМХО, ессно


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
dahilu
Дата 22.8.2012, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 9.9.2010

Репутация: нет
Всего: нет



Цитата(borisbn @ 22.8.2012,  10:30)
1) В h-никах делают только объявление, а описание делают в cpp-шниках. Перенеси int VarA; в main.cpp, а в main.h сделай extern int VarA; и в MyTHRD.h он уже не нужен.


Спасибо за ответ, я попробовал, все заработало. но у меня все равно есть вопросы:
Почему я должен переносить объявление переменной VarA в Main.cpp? Разве объявления в Main.h некорректно? 
Из книги архангельского (стр 52 1 абзац) я понял что спецификацию extrern надо писать в модуле куда подключаю, в данном случае, Main.h, или это с потоками не работает?или я не правильно понял когда надо использовать extern?


Это сообщение отредактировал(а) dahilu - 22.8.2012, 12:54
PM MAIL   Вверх
borisbn
Дата 23.8.2012, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(dahilu @  22.8.2012,  12:25 Найти цитируемый пост)
Разве объявления в Main.h некорректно? 

нет. если в h-нике описать переменную, то, инклюдая этот h-ник в 2 разных cpp-шника ( в твоём случае Main.cpp и MyTHRD.cpp ), ты получаешь описание двух переменных с одним и тем же именем. Вот он и ругается.

и ещё. ты учёл

Цитата(borisbn @  22.8.2012,  10:30 Найти цитируемый пост)
К VCL-ным компонентам запрещено обращаться из доп.потоков, а ты это делаешь
для этого существует метод TThread::Synchronize()

?



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
dahilu
Дата 24.8.2012, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 9.9.2010

Репутация: нет
Всего: нет



Цитата(borisbn @ 23.8.2012,  10:58)
и ещё. ты учёл

Цитата(borisbn @  22.8.2012,  10:30 Найти цитируемый пост)
К VCL-ным компонентам запрещено обращаться из доп.потоков, а ты это делаешь
для этого существует метод TThread::Synchronize()

?

Да учел. единственное есть вопрос, наверно из-за недопонимания как работает Syncronize():
Например есть вот такой поток
Код

class TCon : public TThread
{            
private:

protected:
        void __fastcall Execute();

public:
        __fastcall TCon(bool CreateSuspended);
        void __fastcall ThreadFunc();
      
};


В ThreadFunc() выполняются много действий  и в середине я обращаюсь к компоненту формы. мне достаточно написать Synchronize(ThreadFunc1) или мне надо написать отдельную функию ThreadSubFunc() в которой будет одно действие (обращение к форме) и тогда уже в ThreadFunc()  писать Synchronize(ThreadSubFunc) ?

Это сообщение отредактировал(а) dahilu - 24.8.2012, 09:43
PM MAIL   Вверх
borisbn
Дата 24.8.2012, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



А чем ThreadFunc1 отличается от ThreadSubFunc ?
В любом случае тебе потребуется доп.функция для обращения к форме, которую нужно будет вызывать через Синхронайз


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 26.8.2012, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(borisbn @  24.8.2012,  09:35 Найти цитируемый пост)
А чем ThreadFunc1 отличается от ThreadSubFunc ?

кол-вом действием..

Цитата(dahilu @  24.8.2012,  08:38 Найти цитируемый пост)
В ThreadFunc() выполняются много действий  и в середине я обращаюсь к компоненту формы.




dahilu, чем быстрее функция вызванная в Synchronize(), тем лучше..


--------------------
PM MAIL WWW   Вверх
borisbn
Дата 26.8.2012, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Аааа... наверное ТС опечатался. Единица после имени функции лишняя ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0739 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.