С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
17 / 17 / 5
Регистрация: 19.09.2012
Сообщений: 216

Сделать слежение

12.02.2013, 21:18. Показов 2476. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно возникла такая необходимость, что нужно тормозить бесконечный цикл на время, пока другая функция выполнится...
Пытался сделать так:
C++
1
2
3
4
5
6
7
8
9
10
bool read;
while(1){
read=true;
slegenie();
sds:
if(read==true){goto sds}
}
void slegenie(){
read=false;
}
В общем должно быть что-то на вроде... мне нужно остановить шаг до выполнения определенных действий в slegenie(); но в конечном итоге получаю зависание всей программы... слышал что можно этот сделать с помощью Thered, но почитав инфу понял, что ничего не понял пока все работает при помощи Sleep... но это получается рулетка какая-то... малейший сбой и все пойдет не так... Добрые люди не могли бы вы помочь в данном вопросе, очень бы пример пригодился

Добавлено через 10 минут
C++
1
slegenie();
не успевает выполниться до прихода на проверку
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.02.2013, 21:18
Ответы с готовыми решениями:

Слежение за клавой
Как сделать так чтоб при зажатии на клавишу F1 она не печатала , но печатала когда при повторном нажатии ?, void __fastcall...

Слежение/контроль за работой принтеров
а реально ли вообще написать програмульку, которая бы снимала данные с принтеров, и записывала кудато в лог ?

Не могу сделать слежение монстра за игроком
Добрый день! Я написал простой скрипт для зомби, чтоб он ходил, но я без понятия, как заставить зомби поворачиваться к игроку? Всё что я...

24
 Аватар для M9ICHIK
63 / 63 / 23
Регистрация: 09.12.2012
Сообщений: 459
12.02.2013, 22:59
C++
1
Application->ProcessMessages();
0
 Аватар для QWIPQ
144 / 123 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2
12.02.2013, 23:03
Цитата Сообщение от M9ICHIK Посмотреть сообщение
Application->ProcessMessages();
на кой? он слипует и основа программы виснет! все же лучше через TTimer проверять или потоком все же (TThread)... не зная весь код нельзя сказать что вам лучше подойдет...
0
17 / 17 / 5
Регистрация: 19.09.2012
Сообщений: 216
12.02.2013, 23:12  [ТС]
QWIPQ, в общем, есть функция, которая конектится к БД Аксесса, делает запрос, получает данные построчно, из строчки берется число одно и с ним составляется команда, которая отсылается железяке на ком порт... так вот, нам нужно держать на нужной строке цикл от запроса, пока не пройдет получение и обработка...
Сейчас все работает "на соплях", но работает:
C++
1
2
3
4
5
6
7
8
while(!Form1->ADOQuery1->Eof)
 {
     read=true;
     adres = Form1->ADOQuery1->FieldByName("Adres")->AsInteger;
     create_comand(6); index=6;
     Sleep(100);
     Application->ProcessMessages();
  }
Функция create_comand(6) формирует команду, отсылает её на железку, другая функция обрабатывает данные и по её окончании нужно продолжить основной цикл... как то так... сорри за корявость, день тяжелый сеня был...
0
 Аватар для M9ICHIK
63 / 63 / 23
Регистрация: 09.12.2012
Сообщений: 459
12.02.2013, 23:15
Цитата Сообщение от QWIPQ Посмотреть сообщение
на кой?
Та понял (внимательней прочитав задание), что она не нужна, просто не смог удалить сообщение
0
 Аватар для QWIPQ
144 / 123 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2
12.02.2013, 23:32
ну если ЦП не жалко (и TThread не разобрался) то можно создать глобальную переменную целочисленную(int), создать TTimer который проверял бы ваш ответ от БД, время на таймер поставить 200 дет, свойство Timer3 установить Enabled=false;

int REZULT=0; //глобальная
.
.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
     if(!Form1->ADOQuery1->Eof)
     {
          read=true;
          adres = Form1->ADOQuery1->FieldByName("Adres")->AsInteger;
          create_comand(6); index=6;
          Application->ProcessMessages();
     {
     else
     {
          REZULT=1;
          Timer1->Enabled=false;
     {
}
а вместо вашего кода вставить

C++
1
2
3
4
Timer1->Enabled=true;
do{
}while(REZULT)!=1);
REZULT=0;
P.S. ну как-то так, над экспериментировать)
1
17 / 17 / 5
Регистрация: 19.09.2012
Сообщений: 216
12.02.2013, 23:36  [ТС]
QWIPQ, спасибо за наводку... но хотелось бы это дело на Thered повесить... почему то кажется что таймер будет что и слип - танцы с бубном... Вы не напишите простой пример как через класс Thered отследить завершенность функции ? был бы признателен, а то в том что я нашел примеры какие-то сомнительные...
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
12.02.2013, 23:38
Все зависит от того завязан ли ADOQuery с видимыми компонетами ...
0
 Аватар для QWIPQ
144 / 123 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2
12.02.2013, 23:46
TTimer - эквивалентен в принципе TThread, просто срабатывает по времени, как вам и надо в принципе! Тот же поток который назначается и высвобождается по времени.

P.S. сейчас основной комп отработает и скину пример потока...
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
12.02.2013, 23:48
Цитата Сообщение от QWIPQ Посмотреть сообщение
TTimer - эквивалентен в принципе TThread, просто срабатывает по времени, как вам и надо в принципе! Тот же поток который назначается и высвобождается по времени.
Не надо Ля-ля не одно и то же совсем...

Код в обработчике таймера выполняется в основном потоке и не требует синхронизации.

Компонент выполняющий запрос не должен участвовать в перерисовке окна программы ( не косвенно, не напрямую), иначе в использовать поток нет смысла....
0
 Аватар для QWIPQ
144 / 123 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2
12.02.2013, 23:59
Цитата Сообщение от Avazart Посмотреть сообщение
Код в обработчике таймера выполняется в основном потоке и не требует синхронизации.
Цитата Сообщение от Fobes Посмотреть сообщение
Вы не напишите простой пример как через класс Thered отследить завершенность функции ?
человек хочет обычную проверку организовать, зачем ему использовать поток и еще его синхронизировать для таких вещей????
я могу представить если всю программу запихнуть в поток и там уже вызывать функцию и применять например SuspendThread() и ResumeThread(), тогда никаких блин зависаний и таймеров!!!
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.02.2013, 00:06
Если говорить GUI и потоке то без синхронизации никак не обойтись...
Для банальной "проверки" нужен вывод в лог или еще куда что уже требует простую, но синхронизацию...

P.S. QWIPQ, Учите матчасть...
0
17 / 17 / 5
Регистрация: 19.09.2012
Сообщений: 216
13.02.2013, 14:48  [ТС]
Avazart, ADOQuery связан с событием приема данных от платы... событие из компонента
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
13.02.2013, 14:58
Вот вы развели маразм, таймеры, нити
Цитата Сообщение от Fobes Посмотреть сообщение
Функция create_comand(6) формирует команду, отсылает её на железку, другая функция обрабатывает данные и по её окончании нужно продолжить основной цикл
Да засуньте вы эту другую функцию, которая обрабатывает данные в этот же цикл и всё. Если я прально понял, всё будет как-то так:
C++
1
2
3
4
5
6
7
while(!Form1->ADOQuery1->Eof) // пока что-то там
 {
     adres = Form1->ADOQuery1->FieldByName("Adres")->AsInteger; // получили исх.данные
     create_comand(6); index=6; // послали данные в железку
     read_answer(); // функция приёма ответа от железки
     Application->ProcessMessages(); // продолжаем цикл
  }
И пока read_answer() не закончится цикл не продолжится.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
13.02.2013, 15:08
mimicria, ну и на read_answer(); попросту зависнет (пока не получит ответ), не дойдя таким образом до Application->ProcessMessages();.
А ребята хотят изобрести семафоры.

Добавлено через 6 минут
Цитата Сообщение от mimicria Посмотреть сообщение
И пока read_answer() не закончится цикл не продолжится.
А, пардон, вы ж это и предлагаете.
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
13.02.2013, 15:12
Цитата Сообщение от SatanaXIII Посмотреть сообщение
ну и на read_answer(); попросту зависнет (пока не получит ответ)
А я насколько понял, программа и не должна ничего делать дальше, пока не получит ответ. А вопрос зависания - это вопрос реализации самой функции read_answer().
Ну и в самом верху топика написано:
Цитата Сообщение от Fobes Посмотреть сообщение
нужно тормозить бесконечный цикл на время, пока другая функция выполнится
0
17 / 17 / 5
Регистрация: 19.09.2012
Сообщений: 216
13.02.2013, 15:22  [ТС]
mimicria, я бы с радостью вставил туда всю обработку, но обработка 100 с лишним строчек да и обращается к ней не только эта частичка кода... хотелось бы просто согласовать это
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
13.02.2013, 15:34
Цитата Сообщение от Fobes Посмотреть сообщение
но обработка 100 с лишним строчек
Эти строчки можно вынести в отдельную функцию? А добавить одну строчку вызова функции уже не так страшно.
Цитата Сообщение от Fobes Посмотреть сообщение
да и обращается к ней не только эта частичка кода
А тем более, если и обращений несколько, надо делать отдельную функцию. Или под обращениями вы понимаете кучу goto в коде? Сейчас как эта обработка организована?
0
17 / 17 / 5
Регистрация: 19.09.2012
Сообщений: 216
13.02.2013, 15:44  [ТС]
mimicria, хм, вот так:
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
void __fastcall TForm1::CommPort1DataReceived(TObject *Sender, DWORD Count)
{
  while( Form1->CommPort1->InBuffUsed ){
          answer+= Form1->CommPort1->GetChar();
          }
Form1->Memo1->Lines->Add("Ответ: " + answer);
//начинаем обработку ответа...
if(answer!=""){
int errors = answer.Pos("$");  //ищем символ ошибки
if(errors==0){  //если нет ошибок
              extern Variant App;
              switch(index){
                           case 0:{ //обработка текущего времени
                           int ts,tm,th,ty1,ty2,ty3;  AnsiString t;
                           ts = StrToInt("$"+answer.SubString(5,2));
                             Form1->Edit3->Text=ts;
                           tm = StrToInt("$"+answer.SubString(7,2));
                             Form1->Edit4->Text=tm;
                           th = StrToInt("$"+answer.SubString(9,2));
                             Form1->Edit5->Text=th;
                           ty1 = StrToInt("$"+answer.SubString(11,2));
                             Form1->Edit6->Text=ty1;
                           ty2 = StrToInt("$"+answer.SubString(13,2));
                             Form1->Edit7->Text=ty2;
                           ty3 = StrToInt("$"+answer.SubString(15,2));
                             Form1->Edit8->Text=ty3;
                           index=-1;
                           }break;
                           case 1:{   //текущее значение
                           //дата
                           int ty1,ty2,ty3;
                           ty1 = StrToInt("$"+answer.SubString(5,2));
                              Form1->Edit14->Text=ty1;
                           ty2 = StrToInt("$"+answer.SubString(7,2));
                             Form1->Edit15->Text=ty2;
                           ty3 = StrToInt("$"+answer.SubString(9,2));
                             Form1->Edit16->Text=ty3;
                             //обрабатываем показания счетчиков
                           int CWD,CWM,CWG,HWD,HWM,HWG;
                           CWD =StrToInt("$"+decode(answer.SubString(11,4)));
                             Form1->Edit17->Text=CWD;
                           HWD =StrToInt("$"+decode(answer.SubString(15,4)));
                             Form1->Edit20->Text=HWD;
                           CWM =StrToInt("$"+decode(answer.SubString(19,6)));
                             Form1->Edit18->Text=CWM;
                           HWM =StrToInt("$"+decode(answer.SubString(25,6)));
                             Form1->Edit21->Text=HWM;
                           CWG =StrToInt("$"+decode(answer.SubString(31,8)));
                             Form1->Edit19->Text=CWG;
                           HWG =StrToInt("$"+decode(answer.SubString(39,8)));
                             Form1->Edit22->Text=HWG;
                             index=-1;
                           }break;
                        /**   case 2:{
                           //дата
                           int ty1,ty2,ty3;
                           ty1 = StrToInt("$"+answer.SubString(5,2));
                              Form1->Edit23->Text=ty1;
                           ty2 = StrToInt("$"+answer.SubString(7,2));
                             Form1->Edit24->Text=ty2;
                           ty3 = StrToInt("$"+answer.SubString(9,2));
                             Form1->Edit25->Text=ty3;
                            Form1->GroupBox4->Caption="Выводим: за день";
                            index=-1;
                           }break; */
                        /**   case 3:{
                           int ty1,ty2,ty3;   //читаем дату
                           ty1 = StrToInt("$"+answer.SubString(5,2));
                              Form1->Edit26->Text=ty1;
                           ty2 = StrToInt("$"+answer.SubString(7,2));
                             Form1->Edit27->Text=ty2;
                           ty3 = StrToInt("$"+answer.SubString(9,2));
                             Form1->Edit28->Text=ty3;
                            //обрабатываем показания
                            Form1->GroupBox4->Caption="Выводим: за месяц";
                            index=-1;
                           }break; */
                           case 4:{ //идентификатор
                           int sn; AnsiString id;
                           sn = StrToInt("$"+decode(answer.SubString(5,4)));
                           Form1->Edit12->Text=sn;
                             for (int i=0;i<40;i++){
                              id+=( char )("0x"+answer.SubString(13+i*2,2)).ToInt( );
                               }
                           Form1->Edit13->Text=id;
                           index=-1;
                           }break;
                           case 6:{
                             //обрабатываем показания счетчиков
                           int CWD,CWM,CWG,HWD,HWM,HWG;
                           DataSource1->DataSet->Edit();
                           CWM =StrToInt("$"+decode(answer.SubString(19,6)));
 DataSource1->DataSet->FieldByName("CW:month")->Value = CWM;
                           HWM =StrToInt("$"+decode(answer.SubString(25,6)));
 DataSource1->DataSet->FieldByName("HW:month")->Value = HWM;
                           CWG =StrToInt("$"+decode(answer.SubString(31,8)));
DataSource1->DataSet->FieldByName("CW:general")->Value = CWG;
                           HWG =StrToInt("$"+decode(answer.SubString(39,8)));
DataSource1->DataSet->FieldByName("HW:general")->Value = HWG;
                             index=-1;
                             Form1->ADOQuery1->Next();
                           read=false;
                           }
                           }
 
}else{ //расшифровка ошибок
if(answer[6]=='0'){Form1->Memo1->Lines->Add("Операция записи успешно выполнена");}
if(answer[6]=='1'){Form1->Memo1->Lines->Add("Ошибка при выполнении");}
if(answer[6]=='2'){Form1->Memo1->Lines->Add("Команда не найдена");}
if(answer[6]=='3'){Form1->Memo1->Lines->Add("Неверный формат команды");}
if(answer[6]=='4'){Form1->Memo1->Lines->Add("Параметр занят");}
if(answer[6]=='5'){Form1->Memo1->Lines->Add("Не верна CRC16 сумма");}
if(answer[6]=='6'){Form1->Memo1->Lines->Add("Готов к программированию");}
if(answer[6]=='7'){Form1->Memo1->Lines->Add("Переполнение буфера");}
if(answer[6]=='8'){Form1->Memo1->Lines->Add("Неверные данные");}
}
}
//тут конец
answer="";
}
это событие от компонента билдера... оно запустится, как только данные пойдут
0
17 / 17 / 5
Регистрация: 19.09.2012
Сообщений: 216
16.02.2013, 20:55  [ТС]
Ап, может кто все-же подскажет с TThread ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.02.2013, 20:55
Помогаю со студенческими работами здесь

Слежение за объектом
Дорогие форумчане! Очень прошу вашей помощи. Поделитесь или сделайте del] программу, которая на видео файле детектирует объекты. Алгоритм...

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

Слежение за каталогом
Доброго времени суток. Решаю избитую вообщем то задачу слежения за появленим файлов в каталоге и раскладывания их по другим директориям. Но...

Слежение за объектом
Здравствуйте. Помогите с задачей: идет видео с камеры. Нажимая на кнопку &quot;stop&quot; на данном кадре выделяются границы объектов. Нажимая на...

Слежение за объектом
Доброго времени суток. У меня вот такая проблема. Есть два объекта, hero и enemy, второй должен следовать за первым. Я уже попробовал по...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru