Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.84/50: Рейтинг темы: голосов - 50, средняя оценка - 4.84
6 / 6 / 1
Регистрация: 01.06.2012
Сообщений: 107

Обращение к переменной из потока

06.06.2012, 08:10. Показов 10409. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Что то не пойму, меняю переменною(int j объявленную в public в основном потоке) из потока запущенного из основного.
C++
1
2
3
4
5
6
7
execute()
{
Form1->j=1;
.......дохрена кода
Form1->j=0;
Terminate();
}
но переменная почемуто не хочет принимать значение......Скажите может я гдето не прав и переменную из потока надо как то по хитрому менять, или может обратно передавать в основной поток.....
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.06.2012, 08:10
Ответы с готовыми решениями:

Обращение к переменной из одного потока в другом
Добрый день, господа форумчане. Есть класс server, который выполняет много какого функционала и он работает в своём потоке. Есть у...

Обращение к элементу WinForms из потока, отличного от потока, в котором это элемент был создан
Пишу приложение, котором при загрузке формы в textbox на этой форме заносятся данные. Причем данных много и процесс занимает длительное...

Возможно ли обращение к переменной с использованием значения строковой переменной?
Есть структура из 20ти различных элементов. Необходимо сформировать строковую переменную, которая бы содержала названия переменных и их...

30
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
06.06.2012, 08:46
Значит ты меняешь не переменную j в основном потоке, а её копию. Попробуй вынести j из формы и объявить с модификатором:
C++
1
extern int j;
Добавлено через 2 минуты
C++
1
2
3
4
// модуль A.cpp
extern const int a = 2;
// модуль B.cpp
extern const int a;
Тогда компоновщик будет считать, что в модулях A.cpp и B.cpp используется одна и та же целая константа с именем a.
Так же можно поступать и с переменными.

Добавлено через 2 минуты
директива extern
0
6 / 6 / 1
Регистрация: 01.06.2012
Сообщений: 107
06.06.2012, 08:59  [ТС]
Так вот думаю в сторону extern
Но у меня присутвует здесь некоторый туман, как правильно делать.
Я создал h file GL.h
C++
1
extern int globalparam1;
Подключил его во всех потоках, и в центральном тоже
C++
1
#include "GL.h"
после в основном потоке
сделал так
C++
1
int globalparam1;
И в остальных потоках уже обращался таким образом
C++
1
globalparam1=1;
Это так я понял по форуму как надо работать с переменными!...но гдето я не правльно понял!
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
06.06.2012, 09:17
А не пробовали передавать указатель на переменную в поток? Это всяко кошерней
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
06.06.2012, 09:21
Ты не понял про копирование переменных. Пока модуль один, можно сколько угодно h и cpp файлов инкладить в один и юзать именно такие переменные и они будут действительно подключаться. Но когда модулей много, то в каждом своя глобальная область видимости и когда какой нибудь модуль инкладит файл с объявлением переменной, или в нём дублируется объявление переменной, то он её копирует. Можно даже в разных модулях объявить глобальные переменные с одним именем и разными типами, они не будут даже копиями. Тебе же нужна область видимости на уровне программы в целом, а в неё включаются только функции и те переменные и константы, которые имеют модификатор extern. Причём, если ты в каком нибудь модуле extern уберёшь, то в нём будет копия. А все модули, в которых одно и то же данное объявлено с модификатором extern подключают себе один и тот же его экземпляр, не копируя. Кроме того, какой толк объявлять глобальные переменные в файле, который не инкладится во все cpp файлы проекта? Ведь дублировать же придётся.
C++
1
int globalparam1;
надо писать как раз в GL.h, а чтоб не копировать, а подключить, даже не
C++
1
int globalparam1;
, а
C++
1
extern int globalparam1;
0
6 / 6 / 1
Регистрация: 01.06.2012
Сообщений: 107
06.06.2012, 09:31  [ТС]
Цитата Сообщение от mimicria Посмотреть сообщение
А не пробовали передавать указатель на переменную в поток? Это всяко кошерней
не не пробывал......лучше скажите сверху что напи сал это правильный вариант работы с переменными extern?

Добавлено через 6 минут
Значит так?
Я создал h file GL.h
C++
1
int globalparam1;
Подключил его во всех потоках, и в центральном тоже
C++
1
#include "GL.h"
после во всех потоках в том числе и в основном
C++
1
extern int globalparam1;
И далее во всех потоках к переменной обращаюсь уже так?
C++
1
globalparam1=1;
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
06.06.2012, 09:38
Цитата Сообщение от proleha Посмотреть сообщение
не не пробывал
А зря.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
DWORD ThreadProc(short *test)
{
        *test=3; // òóò äåéñòâèÿ
        return 0;
}
 
int main()
{
        DWORD TId1;
        HANDLE TH;
        short test=1;
        TH=CreateThread(NULL,NULL, (LPTHREAD_START_ROUTINE)&ThreadProc, &test, NULL, &TId1);
        if (TH==NULL)
        {
                printf("Error Creating Thread");
                return(1);
        }
        WaitForSingleObject(TH, INFINITE);
        printf("%d\n", test);
        system("pause");
        return 0;
}
1
6 / 6 / 1
Регистрация: 01.06.2012
Сообщений: 107
06.06.2012, 09:52  [ТС]
и самое главное что сделал так как сам выше написал, по последнему варианту.........программа копилируется но матюков , что переменная объявлена везде дохрена!

Добавлено через 6 минут
Цитата Сообщение от mimicria Посмотреть сообщение
А зря.
Яж не против, может мысль и гениальная, но когда не получается, даже по приведенному примеру, каким образом работать с переменными правильно из разных потоков, тут уже нервничать начинаешь.

Я так понимаю, что у тебя альтернативный вариант!....и у него есть какието неведомые для меня преимущества......
Но по приведенному тобой примеру мне непонятно....как задать переменной из основного потока значение как это значение поменять из другого потока, и как его посмотреть из третьего потока!
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.06.2012, 10:01
Значит ты меняешь не переменную j в основном потоке, а её копию. Попробуй вынести j из формы и объявить с модификатором:
Ерунда...

C++
1
2
3
4
5
6
7
execute()
 {
 Form1->j=1;
 .......дохрена кода
 Form1->j=0;
 Terminate();
 }
Должно работать.Но нужно больше информации чтоб что-то сказать

GL.h - не думаю что это хорошее название для файла, так как такой файл может существовать ( Open GL)
1
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
06.06.2012, 10:03
Цитата Сообщение от proleha Посмотреть сообщение
Но по приведенному тобой примеру мне непонятно....как задать переменной из основного потока значение
short test=1;
Цитата Сообщение от proleha Посмотреть сообщение
как это значение поменять из другого потока
В CreateThread передается указатель на переменную &test. В функции потока значение изменяется *test=3;
Цитата Сообщение от proleha Посмотреть сообщение
и как его посмотреть из третьего потока!
Передать такой же указатель третьему потоку
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.06.2012, 10:16
Но по приведенному тобой примеру мне непонятно....как задать переменной из основного потока значение как это значение поменять из другого потока, и как его посмотреть из третьего потока!
А вот тут стоит задуматься о необходимости синхронизации...
0
6 / 6 / 1
Регистрация: 01.06.2012
Сообщений: 107
06.06.2012, 10:24  [ТС]
Да данные могу то дать но это бесполезные простыни...
вот ниже основной поток присваивает переменной StFinishTAUFThread=1, а поток когда всё необходимое сделает должен переменной присвоить StFinishTAUFThread=0


из основной формы
C++
1
2
3
4
5
6
7
8
9
10
if (StFinishTAUFThread==0)
    {
    StFinishTAUFThread=1;
    SendTAUFThread * TaufP=new SendTAUFThread(true);
    //TaufP->NumTeleg=NumTeleg;
    TaufP->StDelTaufStack=StDelTaufStack;
    TaufP->NumTelegramText= NumTelegramText;
    TaufP->Priority=tpLower;
    TaufP->Resume();
    }
поток который должен при выполнении до нужного момента дать переменной необходимый результат
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
void __fastcall SendTAUFThread::Execute()
{
 //extern int StTauf00;
 //extern int StFinishTAUFThread;
try
{
//ëîãèêà îòïðàâêè è ïðè¸ìà ñðàçó îòâå÷àòü èëè èç ñòåêà
 StTauf00=1;
 
CoInitialize(NULL);
Form1->Con2->Connected=true;
Form1->Con2->Open();
Form1->Con3->Connected=true;
Form1->Con3->Open();
 
  if (StDelTaufStack==1)
  {
 Form1->DelTaufStack->Parameters->ParamByName("@NumTelegr")->Value=NumTelegramText;
   Form1->DelTaufStack->ExecProc();
   Form1->NumTeleg=Form1->NumTeleg+1;
   }
 
 
Form1->ShowFirstTauf->Active=false;
Form1->ShowFirstTauf->Active=true;
if (Form1->ShowFirstTauf->RecordCount>0)
{
   Form1->SNumTeleg=Form1->NumTeleg;
  while(Form1->SNumTeleg.Length()<6 )
  {
   Form1->SNumTeleg="0"+Form1->SNumTeleg;
  }
  Form1->p_GetZeil->Active=false;
Form1->p_GetZeil->Parameters->ParamByName("@idTAUF")->Value= StrToInt(Form1->ShowFirstTaufID->Value);
Form1->p_GetZeil->Active=true;
  int Zeil=Form1->p_GetZeilZeil->Value;;
 
   Form1->UpdNumTelegStack->Parameters->ParamByName("@IdTaufStack")->Value=Form1->ShowFirstTaufID->Value ;
   Form1->UpdNumTelegStack->Parameters->ParamByName("@NumTelegStack")->Value=Form1->SNumTeleg ;
    Form1->UpdNumTelegStack->ExecProc();
 
 
 
 
      AnsiString TaufTelegS=Form1->SNumTeleg+"0122TAUF"+Form1->ShowFirstTaufNumBox->Text +Form1->ShowFirstTaufNumPoint->Text+Zeil;
 
          //ëîãèêà îòïðàâêè è ïðè¸ìà ñðàçó îòâå÷àòü èëè èç ñòåêà
[B]  StFinishTAUFThread=0;[/B]
   SCLSTaufStr=Form1->GetMyDateTime()+"  |  "+TaufTelegS+"# S";
 Form1->vecLog1.push_back(SCLSTaufStr);
StTauf00=0;
  Form1->TAUFSOCET->Socket->SendText(TaufTelegS);
 
 
 
 
  AnsiString TAUFNumTelegram=TaufTelegS.SubString(0,6);
 AnsiString TAUFTipeTelegram=TaufTelegS.SubString(7,8);
 AnsiString TAUFValueTelegram=TaufTelegS.SubString(15,24);
 AnsiString TAUFNumPoint=TaufTelegS.SubString(39,4);
 Form1->TAUF00NumPoint=TAUFNumPoint;
   if (TAUFNumPoint=="2008")
    {
 
    Form1->Timer2008TAUF->Start();
    Form1->Timer2008TAUF->Reset();
   // LastSCLS2008=Now();
   // TimerSCLS2008->Enabled=true;
 
 
  Form1->vecTAUF2008.push_back(Now());
  Form1->FuncSpeedTAUF2008();
    }
 
      if (TAUFNumPoint=="2009")
    {
 
    Form1->Timer2009TAUF->Start();
    Form1->Timer2009TAUF->Reset();
   // LastSCLS2008=Now();
   // TimerSCLS2008->Enabled=true;
 
 
  Form1->vecTAUF2009.push_back(Now());
  Form1->FuncSpeedTAUF2009();
    }
 
       if (TAUFNumPoint=="2010")
    {
 
    Form1->Timer2010TAUF->Start();
    Form1->Timer2010TAUF->Reset();
   // LastSCLS2008=Now();
   // TimerSCLS2008->Enabled=true;
 
 
  Form1->vecTAUF2010.push_back(Now());
  Form1->FuncSpeedTAUF2010();
 
      }
 
      if (TAUFNumPoint=="2011")
    {
 
    Form1->Timer2011TAUF->Start();
    Form1->Timer2011TAUF->Reset();
   // LastSCLS2008=Now();
   // TimerSCLS2008->Enabled=true;
 
 
  Form1->vecTAUF2011.push_back(Now());
  Form1->FuncSpeedTAUF2011();
    }
 
 
 
 
  //AnsiString hj=Now();
 //Form1->LogSCLSTAUF->Lines->Add(Form1->GetMyDateTime()+"  |  "+TaufTelegS+"# S");
 
 
 //Synchronize(&AddLogSCLSTauF);
 
}
 
}
catch(Exception *ex)
{
  /*Form1->ListPage->ActivePage=Form1->dxTabSheet6;
Form1->MemoError->Lines->Add(Form1->GetMyDateTime()+ " îøèáêà TAUF ïîòîêà");
Form1->MemoError->Lines->Add(Form1->GetMyDateTime()+ "  "+ ex->Message);
  */
  StFinishTAUFThread=0;
ErrorStr=Form1->GetMyDateTime()+ " Îøèáêà ïîòîêà TAUF";
     Form1->vecLog1.push_back(Form1->GetMyDateTime()+ " Îøèáêà ïîòîêà TAUF");
       Form1->vecLog1.push_back(Form1->GetMyDateTime()+ "  "+ ex->Message);
    Synchronize(& AddLogError);
     ErrorStr= Form1->GetMyDateTime()+ "  "+ ex->Message;
    Synchronize(& AddLogError);
 
   Terminate();
}
 
 Terminate();
}
//---------------------------------------------------------------------------
Добавлено через 3 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
А вот тут стоит задуматься о необходимости синхронизации...
на уровне логики пытался слепить синхронизация, тоесть знаю что мне нет необходимости разрешать запуск повторного потока, пока некоторые переменные не примут необходимые значения......

Добавлено через 3 минуты
Цитата Сообщение от mimicria Посмотреть сообщение
short test=1;

В CreateThread передается указатель на переменную &test. В функции потока значение изменяется *test=3;

Передать такой же указатель третьему потоку
смотри я так создаю поток, как мне передать указатель на переменную!
C++
1
2
3
4
5
6
SendTAUFThread * TaufP=new SendTAUFThread(true);
    //TaufP->NumTeleg=NumTeleg;
    TaufP->StDelTaufStack=StDelTaufStack;
    TaufP->NumTelegramText= NumTelegramText;
    TaufP->Priority=tpLower;
    TaufP->Resume();
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.06.2012, 10:26
Нужно ли синхронизировать доступ к переменной из двух потоков?
Определить состояние потока TThread
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
06.06.2012, 10:33
Цитата Сообщение от mimicria Посмотреть сообщение
А не пробовали передавать указатель на переменную в поток? Это всяко кошерней
Тогда или при старте потока параметром, или сам указатель должен быть extern в глобале.

Добавлено через 3 минуты
Цитата Сообщение от proleha Посмотреть сообщение
Яж не против, может мысль и гениальная, но когда не получается, даже по приведенному примеру, каким образом работать с переменными правильно из разных потоков, тут уже нервничать начинаешь.
Бегун трусцой на 50 метров, говорящий: "Если даже марафон не получается пробежать в темпе спринта, то надо хоть как то научиться". Указатель потому и кошерней, что проще и напортачить с ним сложнее.
0
6 / 6 / 1
Регистрация: 01.06.2012
Сообщений: 107
06.06.2012, 10:35  [ТС]
ага прочитал я чуть ранее твои темы, когда ты начал помогать! с этими потоками!........и понял что не один я интерисуюсь чудесами потоков!........я уже вапще спустился до того что начал методом тыка вставлять и объявлять переменные.....

Но вот уже точно знаю...что переменная объявленная в основном потоке в h файле глобальных переменных!
int y;

не всегда будет изменяться из другого потока таким образом
Form1->y=1;

у меня две одинаковых переменных, одна меняется вторая нет!...мистика
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
06.06.2012, 10:36
Цитата Сообщение от Avazart Посмотреть сообщение
А вот тут стоит задуматься о необходимости синхронизации..
Синхронизация нужна только большим, или связанным данным.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.06.2012, 10:47
у меня две одинаковых переменных, одна меняется вторая нет!...мистика
Ну думаю тут одно обьяснение - перевенная меняется еще где то, так что ты просто не видишь что она менялась

Добавлено через 5 минут
Синхронизация нужна только большим, или связанным данным.
Вопрос не в самих данных, а в возможном нарушении логики программы...
0
6 / 6 / 1
Регистрация: 01.06.2012
Сообщений: 107
06.06.2012, 11:40  [ТС]
кажится понял с указателями .......щас попробую если получится приведу, свой тупняк

Добавлено через 36 минут
Да лыжи вапще не едут!
В основном потоке, запускаю другой поток и передаю ему указатель
C++
1
2
3
4
5
6
7
8
//Объявил переменную!
int StTauf00=0;
 
SendTAUFThread * TaufP=new SendTAUFThread(true);
    //передал указатель
    TaufP->StTauf00=&StTauf00;
    TaufP->Priority=tpLower;
    TaufP->Resume();
в h файле потока объявил
short *StTauf00;
в execute потока присвоил
*StTauf00=1;
и после действий
CoInitialize(NULL);
хоть за присваиваяйся в потоке .....Хрен чё будет!

Добавлено через 11 минут
вот думал что будет тут засада!...и чё теперь делать, как обходить? если уберу CoInitileze будет ошибка
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
06.06.2012, 11:48
Цитата Сообщение от Avazart Посмотреть сообщение
Вопрос не в самих данных, а в возможном нарушении логики программы...
И как она сможет нарушиться? Есть у тебя переменная, в неё ты присваиваешь значение за один такт, с другими данными она ни как не связана. Откуда нарушение? Когда инкремент счётчика и счётчик этот больше шины, то ++i ведёт к:
1. Увеличивается на 1 младшая половина i.
2. В этот момент может влезть второй поток.
3. Если младшая половина обнулилась в п.1., то увеличивается на 1 старшая часть.
Пример: i==65535, sizeof(i)=4, а шина 2 байта, выполняем ++i:
1. LOWORD(i)==65535, HIWORD(i)==0.
2. ++LOWORD(i).
3. LOWORD(i)==0, HIWORD(i)==0, то есть i=0. Значение ещё не правильно.
4. в этот момент может влезть второй поток и прочитать не правильное значение.
5. if (в п.3. LOWORD(i)==0) ++HIWORD(i);
6. LOWORD(i)==0, HIWORD(i)==1, то есть i=65536. Значение уже правильно.
Теперь тот же счётчик влезает в 4-х байтную шину: i==65535, sizeof(i)=4, а шина 4 байта, выполняем ++i:
1. ++i.
2. i=65536. Значение уже правильно.
3. В этот момент может влезть второй поток.
Или
1. В этот момент может влезть второй поток. i=65535, но для данного момента это ещё правильное значение.
2. ++i.
3. i=65536. Значение уже правильно.
Где нарушение логики? А вот если переменная связана с чем то ещё, то ты можешь её изменить, а другие данные не успеть, или наоборот. И если она большая, то ты можешь не успеть её изменить до полностью.

Добавлено через 45 секунд
Цитата Сообщение от proleha Посмотреть сообщение
SendTAUFThread * TaufP=new SendTAUFThread(true);
* * //передал указатель
* * TaufP->StTauf00=&StTauf00;
* * TaufP->Priority=tpLower;
* * TaufP->Resume();
не передал.

Добавлено через 1 минуту
proleha, указателем должен быть параметр функции потока.
1
6 / 6 / 1
Регистрация: 01.06.2012
Сообщений: 107
06.06.2012, 11:51  [ТС]
Цитата Сообщение от taras atavin;3131447[/QUOTE

ЫЫ...лучше покажи как совладать с этими указателями....
CoInitilize(Null)
и всё переменные в одном потоке живут своей жизнью, в другом своей!

Добавлено через 1 минуту
Добавлено через 1 минуту
proleha, указателем должен быть параметр функции потока.
не понял!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.06.2012, 11:51
Помогаю со студенческими работами здесь

Обращение к контролу из потока
Подскажите, как следует обращаться к контролу из другого потока? Например в этом случае: namespace SilverlightApplication3 { ...

Обращение к Label из потока
Доброго времени! Форма, на форме кнопка запуска и 2 штуки label, видимый &quot;работаю&quot; и невидимый &quot;жду&quot;. Создаем отдельный...

Обращение из потока к контролу
Приветствую! Сегодня у меня печальный день((( Пол дня потратил чтобы решить проблему, так и не смог понять в чем дело. Вернее отдаленно в...

Обращение к контролу из потока
Помогите пожалуйста разобраться с обращением к контролам из потока. Приведенный под спойлером для примера код взят помоему с msdn и...

Обращение к ListView из потока
Доброго времени суток. Не могу разобраться с доступом к listView с другого потока. Пишу прокси сервер, на каждый запрос браузера создаю...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru