Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 20.08.2008
Сообщений: 26
1

Значение глобальной переменной в потоке не изменяется

27.08.2008, 16:20. Показов 1700. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
У меня возник вопрос по поводу потоков. Есть глобальная переменная i, которая изменяется через определнный промежуток времени. Пытаюсь вывести ее значение в потоке, но ничего не выходит - значение переменной не изменяется.
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
//это форма с одним Label
Th *pot;
int i;//вот эта переменная
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 pot = new Th(true);//создаю объект класса Th
 i = 0;//обнуляю i
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::ButtonTimerClick(TObject *Sender)
{
 Timer1->Enabled = !Timer1->Enabled;//запускаю таймер
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
 if (i < 100) i += 5;//изменяю значение i через определенный промежуток времени
 else i = 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonStartClick(TObject *Sender)
{
 pot->Resume();//запускаю поток
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonStopClick(TObject *Sender)
{
 pot->Suspend();//приостанавливаю
}
//---------------------------------------------------------------------------
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//////////////////////////////////////////////////////////////////////////////////////////
////////////класс Th///////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
Th.H
//---------------------------------------------------------------------------
 
#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <Classes.hpp>
//---------------------------------------------------------------------------
class Th : public TThread
{            
private:
protected:
        void __fastcall Execute();
public:
        __fastcall Th(bool CreateSuspended);
        void __fastcall Upd();
};
//---------------------------------------------------------------------------
#endif
//////////////////////////////////////////////////////////////////////////////////////////
Th.CPP
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
37
38
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit2.h"
#include "Unit1.h"
#pragma package(smart_init)
extern int i;
//---------------------------------------------------------------------------
 
//   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 Th::UpdateCaption()
//      {
//        Form1->Caption = "Updated in a thread";
//      }
//---------------------------------------------------------------------------
__fastcall Th::Th(bool CreateSuspended)
        : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall Th::Execute()
{
       Synchronize(Upd);
        //---- Place thread code here ----
}
//---------------------------------------------------------------------------
 void __fastcall Th::Upd()
 {
    Form1->StaticText2->Caption = "i = "+IntToStr(i);//вывожу значение i
 }
Переменная i имеет то значение, которое было в тот момент, когда использовался метод Resume(). Заранее признателен за помощь!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.08.2008, 16:20
Ответы с готовыми решениями:

Как получить значение переменной созданной в потоке, в другом потоке?
Добрый день :) Возник такой вопрос &quot;как получить значение переменной созданной в потоке, в другом...

Как избежать изменения одной переменной ссылочного типа, когда изменяется значение другой переменной
Подскажите, пожалуйста, как избежать изменения одной переменной ссылочного типа, когда изменяется...

Значение глобальной переменной
Всем доброго времени суток, возможно такое было уже где-то извеняюсь за повтор, но я не нашол...

Значение глобальной переменной пропадает
При входе в БД глобальной переменной присваиваю логин пользователя. В процессе работы аксик его...

1
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
28.08.2008, 11:20 2
я не скажу, почему у тебя не работает, но по опыту скажу, что использовать глобальные переменные в потоках черевато непредвиденными последствиями, а тебе могу одно посоветовать трассируй, может тогда что-то увидишь, а еще попробуй свою переменную сделать свойством класса...
0
28.08.2008, 11:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.08.2008, 11:20
Помогаю со студенческими работами здесь

Не меняется значение глобальной переменной
Недавно начал учить JS, но знаю и другие языки; Столкнулся с проблемой: данный ниже код не...

Значение глобальной переменной из Edit
Добрый день, я совсем новый человек в delphi, поэтому нужна помощь: Как присвоить значение...

Как в БД записать значение глобальной переменной?
У меня есть класс с глобальной переменной: namespace NextPrint { class GlobalTrash { ...

Значение локальной переменной передать глобальной
Доброго дня господа. Подскажите такой вопрос, есть локальная переменная, которая работает в...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru