Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.69/16: Рейтинг темы: голосов - 16, средняя оценка - 4.69
43 / 1 / 1
Регистрация: 05.01.2014
Сообщений: 337

Как обеспечить синхронизацию двух событий, описанных в разных потоках методом execute()

10.02.2014, 12:44. Показов 3500. Ответов 38
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Подскажите пожалуйста, как обеспечить синхронизацию двух событий, описанных в разных потоках методом execute() ?
В первом- описан вывод цветов RGB на форму, во втором- вывод звука через миди. При включении двух этих потоков одновременно, получается рассинхронизация.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.02.2014, 12:44
Ответы с готовыми решениями:

Как обеспечить синхронизацию xchg для нескольких потоков?
Добрый вечер. Требуется небольшая консультация по мьютексам. Вообщем, вопрос в следующем. Есть код на ассемблере для захвата мьютекса, в...

Не работают getch() и cin в двух разных потоках на ввод одновременно/Как снизить нагрузку на процессор?
Код: #include <iostream> #include <cstdlib> #include <conio.h> #include <thread> // g++ th.cpp -o th -lws2_32 -std=c++11 ...

Движение двух фигур в разных потоках
Привет всем!всех с новым годом!и снова я к вам с моими проблемами) короче пишу игрушку в консоле,столкнулся впервые с...

38
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
13.02.2014, 11:39
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Pir12345 Посмотреть сообщение
если подключить звуковой поток- алгоритм сбивается и нет синхронизации цвета и звука
У вас в каждом из этих потоков есть по собственному циклу, который этим всем и занимается.
C++
1
2
3
4
  for( i = 0; i < ListItemsCount ; i++ )
    {
    for( j = 1; j<8; j++ )
      {
Потоки они на то и потоки, что будут действовать независимо друг от друга. Вам нужно синхронизировать эти циклы.
0
43 / 1 / 1
Регистрация: 05.01.2014
Сообщений: 337
13.02.2014, 11:55  [ТС]
Да, увидел отличия, Вы говорите про циклы перед куском кода цвета и звука. А как их синхронизировать?В вашем коде можно добавить ту синхронизацию как вы использовали?

Добавлено через 12 минут
Добавил циклы для цвета и звука вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void __fastcall ColorThread::RecolorForm()
{
Synchronize( GetCount );
  for( i = 0; i < ListItemsCount ; i++ )
    {
    for( j = 1; j<8; j++ )
      {
      Synchronize( GetSubstrAndPutToData );
   
       if(Data1 == 1) { Form1->Color = (TColor)RGB(255,0,0); }
  else if(Data1 == 2) { Form1->Color = (TColor)RGB(255,102,0); }
  else if(Data1 == 3) { Form1->Color = (TColor)RGB(255,255,0); }
  else if(Data1 == 4) { Form1->Color = (TColor)RGB(0,153,51); }
  else if(Data1 == 5) { Form1->Color = (TColor)RGB(102,255,255); }
  else if(Data1 == 6) { Form1->Color = (TColor)RGB(51,0,255); }
  else if(Data1 == 7) { Form1->Color = (TColor)RGB(153,0,255); }
                    // else { Form1->Color = (TColor)RGB(255,255,255); }
  Form1->Repaint();
   Sleep(MySleep);
}  } }
Заработали цвета, но перестал работать стоп и звук
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
13.02.2014, 11:56
Pir12345, тут возникает вопрос - нужно ли вам именно два потока на звук и на цвет? Объединить их в один это самый легкий путь.
Если же вам нужны оба этих потока, то нужно уже думать. Есть куча способов подобной синхронизации. Первое, что приходит в голову это в главном потоке (потоке формы) запустить требуемый цикл, переменную Data1 сделать членом формы (ну или глобальной), в цикле ее изменять, а из потоков получать ее значение. Таким образом, каждый поток будет работать с одними и теми же данными, с одной и той же цифрой.
Или, к примеру, можно запустить цикл только в одном потоке. И выбрасывать какой-нибудь флаг завершения итерации. А вторым потоком постоянно мониторить первый и ожидать этот флаг.
0
43 / 1 / 1
Регистрация: 05.01.2014
Сообщений: 337
13.02.2014, 12:01  [ТС]
Мне нужно просто чтобы одновременно воспроизводились цвет и звук(синхронно). Если их объединить в один поток- есть вероятность, что: 1)При выполнении цикла программа зависнет 2) не будет работать СТОП.
Собственно почему я и делил все модули на потоки.
Если такого не будет, пожалуйста, пусть будет и цвет и звук в одном потоке.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
13.02.2014, 12:05
Цитата Сообщение от Pir12345 Посмотреть сообщение
Добавил циклы
А у ColorThread появился метод GetSubstrAndPutToData? В моем варианте его не было.
И метод RecolorForm и так вызывается из-под синхронизации. Не надо, коли вы так сделали, внутри него опять же синхронизироваться с той же формой.
0
43 / 1 / 1
Регистрация: 05.01.2014
Сообщений: 337
13.02.2014, 12:08  [ТС]
Да появился и в .cpp и в .h соответственно. Вот тот кусок кода:
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
void __fastcall ColorThread::RecolorForm()
{
Synchronize( GetCount );
  for( i = 0; i < ListItemsCount ; i++ )
    {
    for( j = 1; j<8; j++ )
      {
      Synchronize( GetSubstrAndPutToData );
  //Data1 = StrToInt(Form1->ListBox1->Items->Strings[i].SubString(j,1));
       if(Data1 == 1) { Form1->Color = (TColor)RGB(255,0,0); }
  else if(Data1 == 2) { Form1->Color = (TColor)RGB(255,102,0); }
  else if(Data1 == 3) { Form1->Color = (TColor)RGB(255,255,0); }
  else if(Data1 == 4) { Form1->Color = (TColor)RGB(0,153,51); }
  else if(Data1 == 5) { Form1->Color = (TColor)RGB(102,255,255); }
  else if(Data1 == 6) { Form1->Color = (TColor)RGB(51,0,255); }
  else if(Data1 == 7) { Form1->Color = (TColor)RGB(153,0,255); }
                    // else { Form1->Color = (TColor)RGB(255,255,255); }
  Form1->Repaint();
   Sleep(MySleep);
}  } }
 
void __fastcall SoundThread::Execute()
{
  midiOutOpen(&Out,0,0,0,0);
 
  Synchronize( GetCount );
  for( i = 0; i < ListItemsCount ; i++ )
    {
    for( j = 1; j<8; j++ )
      {
      Synchronize( GetSubstrAndPutToData );
 
           if(Data1 == 1) { Msg = (0x90 + (60 * 0x100) + (0x7f * 0x10000)); midiOutShortMsg(Out,Msg); }
      else if(Data1 == 2) { Msg = (0x90 + (62 * 0x100) + (0x7f * 0x10000)); midiOutShortMsg(Out,Msg); }
      else if(Data1 == 3) { Msg = (0x90 + (64 * 0x100) + (0x7f * 0x10000)); midiOutShortMsg(Out,Msg); }
      else if(Data1 == 4) { Msg = (0x90 + (65 * 0x100) + (0x7f * 0x10000)); midiOutShortMsg(Out,Msg); }
      else if(Data1 == 5) { Msg = (0x90 + (67 * 0x100) + (0x7f * 0x10000)); midiOutShortMsg(Out,Msg); }
      else if(Data1 == 6) { Msg = (0x90 + (69 * 0x100) + (0x7f * 0x10000)); midiOutShortMsg(Out,Msg); }
      else if(Data1 == 7) { Msg = (0x90 + (71 * 0x100) + (0x7f * 0x10000)); midiOutShortMsg(Out,Msg); }
 
      Sleep( MySleep );
      Application->ProcessMessages();
 
      Synchronize( IsTerminated );
      if( terminateSound )
        {
        midiOutClose(&Out);
        break;
        }
      }
    }
 
  midiOutClose(&Out);
}

По идее по этому методу GetSubstrAndPutToData они уже синхронизированы(ну логически)
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
13.02.2014, 12:11
Вот такое соответствие?

Цветовой поток Звуковой поток
Form1->Color = (TColor)RGB(255,0,0); Msg = (0x90 + (60 * 0x100) + (0x7f * 0x10000)); midiOutShortMsg(Out,Msg);
Form1->Color = (TColor)RGB(255,102,0); Msg = (0x90 + (62 * 0x100) + (0x7f * 0x10000)); midiOutShortMsg(Out,Msg);
Form1->Color = (TColor)RGB(255,255,0); Msg = (0x90 + (64 * 0x100) + (0x7f * 0x10000)); midiOutShortMsg(Out,Msg);
Form1->Color = (TColor)RGB(0,153,51); Msg = (0x90 + (65 * 0x100) + (0x7f * 0x10000)); midiOutShortMsg(Out,Msg);
Form1->Color = (TColor)RGB(102,255,255); Msg = (0x90 + (67 * 0x100) + (0x7f * 0x10000)); midiOutShortMsg(Out,Msg);
Form1->Color = (TColor)RGB(51,0,255); Msg = (0x90 + (69 * 0x100) + (0x7f * 0x10000)); midiOutShortMsg(Out,Msg);
Form1->Color = (TColor)RGB(153,0,255); Msg = (0x90 + (71 * 0x100) + (0x7f * 0x10000)); midiOutShortMsg(Out,Msg);

Добавлено через 27 секунд
Цитата Сообщение от Pir12345 Посмотреть сообщение
Да появился
Зачем?
И покажите реализацию.
0
43 / 1 / 1
Регистрация: 05.01.2014
Сообщений: 337
13.02.2014, 14:12  [ТС]
Да такое соответствие, если в labeledit1 введены числа 1234567, если введена другая комбинация- то в соответствии с ней(ну это уже не критично...это просто переменная вводится в labeledit1).

Вот реализация:
C++
1
2
3
4
void __fastcall ColorThread::GetSubstrAndPutToData()
{
  Data1 = StrToInt( Form1->ListBox1->Items->Strings[i].SubString(j,1) );
}
Добавлено через 1 час 56 минут
SatanaXIII, похоже понял.
Убрал с Вашего кода вот это(сделал напрямую, как в звуке):
C++
1
2
3
4
void __fastcall ColorThread::RecolorForm()
{
 
}
Получил то, что нужно. Спасибо!
Разбираюсь с кодом и тестирую дальше!
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
13.02.2014, 14:17
Может быть следующий мой вопрос покажется вам странным, но зачем вам вообще тут потоки?
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
//Запуск потока расчета
void __fastcall TForm1::Button1Click(TObject *Sender)                 // Рассчет
 {
 Form1->ListBox1->Clear();
 Form1->ListBox2->Clear();
 calcThread_1 = new CalcThread(false);
 }
//---------------------------------------------------------------------------
 
//Запуск потока цвета и звука
void __fastcall TForm1::Button2Click(TObject *Sender)                 // Запуск
{
  MyTerminated = false;
  //colorThread_1 = new ColorThread(false);
  //soundThread_1 = new SoundThread(false);
 
  int Data1;
  HMIDIOUT Out;
  DWORD Msg;
  midiOutOpen(&Out,0,0,0,0);
  for( int i = 0; i < Form1->ListBox1->Count ; i++ )
    {
    for( int j = 1; j<8; j++ )
      {
      Data1 = StrToInt(Form1->ListBox1->Items->Strings[i].SubString(j,1));
      switch( StrToInt(Form1->ListBox1->Items->Strings[i].SubString(j,1)) )
        {
        case 1: { Form1->Color = (TColor)RGB(255,0,0);
                   Msg = (0x90 + (60 * 0x100) + (0x7f * 0x10000));
                   midiOutShortMsg(Out,Msg); }
                   break;
        case 2: { Form1->Color = (TColor)RGB(255,102,0);
                   Msg = (0x90 + (62 * 0x100) + (0x7f * 0x10000));
                   midiOutShortMsg(Out,Msg); }
                   break;
        case 3: { Form1->Color = (TColor)RGB(255,255,0);
                   Msg = (0x90 + (64 * 0x100) + (0x7f * 0x10000));
                   midiOutShortMsg(Out,Msg); }
                   break;
        case 4: { Form1->Color = (TColor)RGB(0,153,51);
                   Msg = (0x90 + (65 * 0x100) + (0x7f * 0x10000));
                   midiOutShortMsg(Out,Msg); }
                   break;
        case 5: { Form1->Color = (TColor)RGB(102,255,255);
                   Msg = (0x90 + (67 * 0x100) + (0x7f * 0x10000));
                   midiOutShortMsg(Out,Msg); }
                   break;
        case 6: { Form1->Color = (TColor)RGB(51,0,255);
                   Msg = (0x90 + (69 * 0x100) + (0x7f * 0x10000));
                   midiOutShortMsg(Out,Msg); }
                   break;
        case 7: { Form1->Color = (TColor)RGB(153,0,255);
                   Msg = (0x90 + (71 * 0x100) + (0x7f * 0x10000));
                   midiOutShortMsg(Out,Msg); }
                   break;
        }
 
      Form1->Repaint();
 
      Sleep( MySleep );
      Application->ProcessMessages();
      if( MyTerminated )
        goto halt;
      }
 
    }
halt:
OnResetColor();
midiOutClose(Out);
}
//---------------------------------------------------------------------------
 
//Закрытие потоков
 
void __fastcall TForm1::Button3Click(TObject *Sender)                 // Стоп
{
  MyTerminated = true;
  //colorThread_1->Terminate(); //new ColorThread(true);
  //soundThread_1->Terminate(); //new SoundThread(true);
  midiOutClose(Out);
  OnResetColor();
}
0
43 / 1 / 1
Регистрация: 05.01.2014
Сообщений: 337
14.02.2014, 09:42  [ТС]
Нет не странный вопрос.
Зачем тут потоки- долгая история попыток написать и оптимизировать работу.
Во всех вариантах без потоков у меня 1)зависала(останавливалась) программа на определенном цвете(курсор мышки крутился) (это при наличии одновременно звука)- видимо из за большого количества обрабатываемых строк 2) не работала кнопка стоп.
Почитал, что потоки разграничивают и оптимизируют работу. Соответственно принялся в бой.
Ну вот так.


Сейчас попробую как предлагаете!Такой вариант я вроде не рассматривал.

Добавлено через 19 часов 17 минут
SatanaXIII, проверил, код из 29 поста тоже работает, и не зависает ничего. Единственное что, при такой совметной записи цвета и звука в радиогруппе1, как развести второй радиогруппой, состоящей из двух кнопок- 1.воспроизводить только цвет 2. Цвет+звук ?
Где подлезть то можно?
Пробовал тут midiOutOpen(&Out,0,0,0,0); вставить радиогруппу, не идет.
В случае присутствия потока цвета и звуа отдельно- там просто, выключаю поток звука и все.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
14.02.2014, 10:39
Типа тогошеньки:
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
//Запуск потока цвета и звука
void __fastcall TForm1::Button2Click(TObject *Sender)                 // Запуск
{
  MyTerminated = false;
  //colorThread_1 = new ColorThread(false);
  //soundThread_1 = new SoundThread(false);
 
  int Data1;
  HMIDIOUT Out;
  DWORD Msg;
  midiOutOpen(&Out,0,0,0,0);
  for( int i = 0; i < Form1->ListBox1->Count ; i++ )
    {
    for( int j = 1; j<8; j++ )
      {
 
 
      switch( StrToInt(Form1->ListBox1->Items->Strings[i].SubString(j,1)) )
        {
        case 1: { Form1->Color = (TColor)RGB(255,0,0);
                  if( RadioGroup2->ItemIndex == 1 )
                    Msg = (0x90 + (60 * 0x100) + (0x7f * 0x10000));
                } break;
        case 2: { Form1->Color = (TColor)RGB(255,102,0);
                  if( RadioGroup2->ItemIndex == 1 )
                    Msg = (0x90 + (62 * 0x100) + (0x7f * 0x10000));
                } break;
        case 3: { Form1->Color = (TColor)RGB(255,255,0);
                  if( RadioGroup2->ItemIndex == 1 )
                    Msg = (0x90 + (64 * 0x100) + (0x7f * 0x10000));
                } break;
        case 4: { Form1->Color = (TColor)RGB(0,153,51);
                  if( RadioGroup2->ItemIndex == 1 )
                    Msg = (0x90 + (65 * 0x100) + (0x7f * 0x10000));
                } break;
        case 5: { Form1->Color = (TColor)RGB(102,255,255);
                  if( RadioGroup2->ItemIndex == 1 )
                    Msg = (0x90 + (67 * 0x100) + (0x7f * 0x10000));
                } break;
        case 6: { Form1->Color = (TColor)RGB(51,0,255);
                  if( RadioGroup2->ItemIndex == 1 )
                    Msg = (0x90 + (69 * 0x100) + (0x7f * 0x10000));
                } break;
        case 7: { Form1->Color = (TColor)RGB(153,0,255);
                  if( RadioGroup2->ItemIndex == 1 )
                    Msg = (0x90 + (71 * 0x100) + (0x7f * 0x10000));
                } break;
        }
      midiOutShortMsg(Out,Msg);
 
      Form1->Repaint();
 
      Sleep( MySleep );
      Application->ProcessMessages();
      if( MyTerminated )
        goto halt;
      }
 
    }
halt:
OnResetColor();
midiOutClose(Out);
}
0
43 / 1 / 1
Регистрация: 05.01.2014
Сообщений: 337
14.02.2014, 10:58  [ТС]
Да, работает, спасибо!
Интересный подход, в одной группе кейсов указывать цвет, звук, да еще и разделение...раньше я думал что компилятор читает последовательно и целой цепочки перебора цветов и звуков неполучиться.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
14.02.2014, 11:15
Цитата Сообщение от Pir12345 Посмотреть сообщение
компилятор читает последовательно
Вообще то так и есть. Просто разница во времени на столько мала, что для вашего случая не существенна.

Добавлено через 10 минут
Более менее по человечески:
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
//Запуск потока цвета и звука
void __fastcall TForm1::Button2Click(TObject *Sender)                 // Запуск
{
  MyTerminated = false;
  //colorThread_1 = new ColorThread(false);
  //soundThread_1 = new SoundThread(false);
  TColor formColor;
  int number;
  bool enableSound = false;
  if( RadioGroup2->ItemIndex )
    enableSound = true;
  HMIDIOUT Out;
  DWORD Msg;
  midiOutOpen(&Out,0,0,0,0);
 
  for( int i = 0; i < Form1->ListBox1->Count ; i++ )
    {
    for( int j = 1; j<8; j++ )
      {
      switch( StrToInt(Form1->ListBox1->Items->Strings[i].SubString(j,1)) )
        {
        case 1: formColor = RGB( 255,0,0 );
                if( enableSound ) number = 60; break
 
        case 2: formColor = RGB( 255,102,0 );
                if( enableSound ) number = 62; break;
 
        case 3: formColor = RGB( 255,255,0 );
                if( enableSound ) number = 64; break;
 
        case 4: formColor = RGB( 0,153,51 );
                if( enableSound ) number = 65; break;
 
        case 5: formColor = RGB( 102,255,255 );
                if( enableSound ) number = 67; break;
 
        case 6: formColor = RGB( 51,0,255 );
                if( enableSound ) number = 69; break;
 
        case 7: formColor = RGB( 153,0,255 );
                if( enableSound ) number = 71; break;
        }
      Form1->Color = formColor;
      if( enableSound )
        {
        Msg = (0x90 + (number * 0x100) + (0x7f * 0x10000));
        midiOutShortMsg(Out,Msg);
        }
 
      Form1->Repaint();
 
      Sleep( MySleep );
      Application->ProcessMessages();
      if( MyTerminated )
        goto halt;
      }
 
    }
halt:
OnResetColor();
midiOutClose(Out);
}
0
43 / 1 / 1
Регистрация: 05.01.2014
Сообщений: 337
14.02.2014, 11:34  [ТС]
Круто!
А если такая разбивка еще? Граммотно? (не учитывая пока конечно ваш последний пост)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
case 2: {  if( RadioGroup3->ItemIndex == 0 )
                   Form1->Color = (TColor)RGB(255,102,0);
                   Msg = (0x90 + (62 * 0x100) + (0x7f * 0x10000));
                   if ( RadioGroup3->ItemIndex == 1 )
                   {Form1->Color = (TColor)RGB(255,0,0);Form1->Repaint();Sleep(MySleep);
        Form1->Color = (TColor)RGB(255,0,0);Form1->Repaint();Sleep(MySleep);
        Form1->Color = (TColor)RGB(0,153,51);Form1->Repaint();Sleep(MySleep);
        Msg= (0x90 + (60 * 0x100) + (0x7f * 0x10000)); midiOutShortMsg(Out,Msg);
        Msg= (0x90 + (60 * 0x100) + (0x7f * 0x10000)); midiOutShortMsg(Out,Msg);
        Msg= (0x90 + (65 * 0x100) + (0x7f * 0x10000)); midiOutShortMsg(Out,Msg);}
                   if( RadioGroup2->ItemIndex == 1 )
                   Msg = (0x90 + (62 * 0x100) + (0x7f * 0x10000));
                   midiOutShortMsg(Out,Msg); }
                   break;
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
14.02.2014, 12:57
Цитата Сообщение от Pir12345 Посмотреть сообщение
Граммотно?
Нет.
Нравоучения
Оформление ужасающее.
C++
1
2
3
4
if( RadioGroup3->ItemIndex == 0 )
                   Form1->Color = (TColor)RGB(255,102,0);
                   Msg = (0x90 + (62 * 0x100) + (0x7f * 0x10000));
                   if ( RadioGroup3->ItemIndex == 1 )
Здесь изменение цвета формы, переменной Msg и проверка радиогруппы на единицу находятся друг под другом - это должно говорить, что они мало того находятся в одной области видимости, так еще и равноправны внутри нее. На самом деле при проверке радиогруппы на ноль, в первой строке, выполнится только изменение цвета формы. Последние две строки должны иметь такой же отступ, как и первая:
C++
1
2
3
4
if( RadioGroup3->ItemIndex == 0 )
                   Form1->Color = (TColor)RGB(255,102,0);
Msg = (0x90 + (62 * 0x100) + (0x7f * 0x10000));
if ( RadioGroup3->ItemIndex == 1 )
Далее.
Шестая и седьмая строка:
C++
6
7
Form1->Color = (TColor)RGB(255,0,0);Form1->Repaint();Sleep(MySleep);
Form1->Color = (TColor)RGB(0,153,51);Form1->Repaint();Sleep(MySleep);
Два изменения цвета подряд. Зачем? В лучшем случае первый цвет моргнет. Но это вряд ли - просто закрасится вторым цветом.
Вот так бы я мог сказать, так как совершенно не видать, что в конце каждой строки стоит слип. Хоть пробелом бы разделили. Все сливается.

С шестой по десятую строку:
C++
6
7
8
9
10
Form1->Color = (TColor)RGB(255,0,0);Form1->Repaint();Sleep(MySleep);
Form1->Color = (TColor)RGB(0,153,51);Form1->Repaint();Sleep(MySleep);
Msg= (0x90 + (60 * 0x100) + (0x7f * 0x10000)); midiOutShortMsg(Out,Msg);
Msg= (0x90 + (60 * 0x100) + (0x7f * 0x10000)); midiOutShortMsg(Out,Msg);
Msg= (0x90 + (65 * 0x100) + (0x7f * 0x10000)); midiOutShortMsg(Out,Msg);
Когда программа войдет в этот блок кода, вы никак не сможете повлиять на ее работу. И вам придется смотреть как она сперва закрашивает форму, потом ждет, потом еще закрашивает, ждет, потом следуют три ответных гудка. И все это именно в такой последовательности.

..и по каждой строке много замечаний.

Вообще все это какая-то неуправляемая мешанина из разношерстных команд. От былой стройности кода не осталось и следа. О какой-то там синхронизации звука с цветом вообще речи не идет.
0
43 / 1 / 1
Регистрация: 05.01.2014
Сообщений: 337
27.02.2015, 12:29  [ТС]
SatanaXIII, спасибо за "нравоучения", вы говорите что зачем писать в одном case два цвета, разделенных
C++
1
Form1->Repaint; Sleep(MySleep)
Дело в том, что тот пример, что вы писали выше (более менее по человечески) предусматривает 7 кейсов на 7 цветов соответственно при условии семизначного массива, но мне еще нужно деление каждого из этих цветов на несколько цветов и воспроизводить их последовательно. А вот как это сделать лучше? вот и делал через разделения.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
05.03.2015, 09:27
Нужно составить общую формулу, алгоритм, в котором все это учесть.

Не по теме:

P.S. Раз в год Pir12345 появляется на форуме и пишет в продолжении темы. Х)

0
43 / 1 / 1
Регистрация: 05.01.2014
Сообщений: 337
05.03.2015, 11:02  [ТС]
SatanaXIII, да, к сожалению так получается что захожу редко. По данному вопросу уже создал новую тему.(в старой написал чтобы не плодить одно и тоже). Помню UI предупреждал, что нужно заводить новую тему.
Поможете с общим алгоритмом(в новой теме)?
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
05.03.2015, 11:30
Все он правильно говорил. Дальнейшее обсуждение в новой теме: Преобразование массива 7 чисел в вывод 12 позиций
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.03.2015, 11:30

Может ли один делегат одновременно работать в двух разных потоках?
Вечер добрый. Такой вопрос. Я так понимаю, один делегат не может одновременно работать в двух разных потоках? Как-то так?

как использовать методы класса в разных потоках?
Пишу программу для обмена данными с usb hid устройством. Чтобы получать данные от устройства в любой момент и не вешать главное окно, решил...

Метод выполнить в 11 разных потоках, соответственно для разных входных массивов
Здравствуйте, начал потихоньку разбираться в многопоточном программирование и не могу до конца разобраться. Допустим есть некий метод в...


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

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Новые блоги и статьи
Знание — сила: Доктрина интенциональности знаний против массовых профанаций
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
SUNO Ai - Река Без Дна
zorxor 31.07.2026
Автор стихотворения - астрофизик Марина Катыс Ссылка на сгенерированную музыкальную композицию: https:/ / suno. com/ song/ 6f6e5464-b290-4650-be6c-44c85f8d8013 Я говорю, что Время- как вода течет. . .
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru