Thread c приоритетом... выполняется с задержками
Буду благодарен если кто нибудь объяснит мне следующую закономерность:
Имеем простой тред который передает время в компонент Memo1 главной формы, тред имет приоритет tpTimeCritical:
Unit1.h
Код:
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
//---------------------------------------------------------------------------
class GetData : public TThread
{
private:
protected:
void __fastcall Execute();
public:
__fastcall GetData(bool CreateSuspended);
Word Hour, Min, Sec, MSec;
int counter;
};
#endif
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
//---------------------------------------------------------------------------
class GetData : public TThread
{
private:
protected:
void __fastcall Execute();
public:
__fastcall GetData(bool CreateSuspended);
Word Hour, Min, Sec, MSec;
int counter;
};
#endif
end of Unit1.h
Unit1.cpp
Код:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "test.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
__fastcall GetData::GetData(bool CreateSuspended)
: TThread(CreateSuspended)
{
counter =0;
}
//---------------------------------------------------------------------------
void __fastcall GetData::Execute()
{
do
{
DecodeTime(Now(), Hour, Min, Sec, MSec);
Form1->Memo1->Lines->Add("------" + IntToStr(Sec)+" "+IntToStr(MSec)+"\t"+IntToStr(counter));
counter++;
}
while (! Terminated);
}
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "test.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
__fastcall GetData::GetData(bool CreateSuspended)
: TThread(CreateSuspended)
{
counter =0;
}
//---------------------------------------------------------------------------
void __fastcall GetData::Execute()
{
do
{
DecodeTime(Now(), Hour, Min, Sec, MSec);
Form1->Memo1->Lines->Add("------" + IntToStr(Sec)+" "+IntToStr(MSec)+"\t"+IntToStr(counter));
counter++;
}
while (! Terminated);
}
end of Unit1.cpp
Основная форма с двумя кнопками и компонентом Memo1:
test.cpp
Код:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "test.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
GetData *Thread;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
void __fastcall TForm1::Button5Click(TObject *Sender)
{
Thread = new GetData(false);
Thread->FreeOnTerminate = true;
Thread->Priority = tpTimeCritical;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button6Click(TObject *Sender)
{
Thread->Terminate();
}
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "test.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
GetData *Thread;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
void __fastcall TForm1::Button5Click(TObject *Sender)
{
Thread = new GetData(false);
Thread->FreeOnTerminate = true;
Thread->Priority = tpTimeCritical;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button6Click(TObject *Sender)
{
Thread->Terminate();
}
//---------------------------------------------------------------------------
end of test.cpp
Запускаем .... ждем .... останавливаем.
В Memo1 имеем:
------24 130 0
------24 130 1
------24 130 2
------24 190 3
------24 190 4
------24 190 5
------24 190 6
------24 190 7
------24 190 8
------24 190 9
------24 190 10
------24 190 11
------24 190 12
------24 190 13
------24 190 14
------24 190 15
------24 190 16
------24 190 17
------24 190 18
------24 190 19
------24 190 20
------24 190 21
------24 190 22
------24 190 23
------24 190 24
------24 240 25
------24 240 26
------24 240 27
------24 240 28
------24 240 29
------24 240 30
------24 240 31
------24 240 32
------24 240 33
------24 240 34
------24 240 35
------24 240 36
------24 240 37
------24 240 38
------24 240 39
------24 300 40
------24 300 41
------24 300 42
------24 300 43
------24 300 44
------24 300 45
------24 300 46
------24 300 47
------24 300 48
------24 300 49
------24 300 50
------24 300 51
------24 300 52
------24 300 53
------24 300 54
------24 300 55
------24 350 56
------24 350 57
------24 350 58
------24 350 59
------24 350 60
------24 350 61
------24 350 62
------24 350 63
------24 350 64
------24 350 65
------24 350 66
------24 350 67
------24 350 68
------24 350 69
------24 350 70
------24 350 71
------24 410 72
------24 410 73
------24 410 74
------24 410 75
------24 410 76
------24 410 77
------24 410 78
------24 410 79
------24 410 80
------24 410 81
------24 410 82
------24 410 83
------24 410 84
------24 410 85
------24 410 86
------24 410 87
------24 460 88
------24 460 89
------24 460 90
------24 460 91
------24 460 92
------24 460 93
------24 460 94
------24 460 95
------24 460 96
------24 460 97
------24 460 98
------24 460 99
------24 520 100
------24 520 101
------24 520 102
------24 520 103
------24 520 104
------24 520 105
------24 520 106
------24 520 107
------24 520 108
------24 520 109
------24 520 110
------24 520 111
------24 570 112
------24 570 113
------24 570 114
------24 570 115
------24 570 116
------24 570 117
------24 570 118
------24 570 119
------24 570 120
------24 570 121
------24 570 122
------24 570 123
------24 570 124
------24 570 125
------24 570 126
------24 570 127
------24 570 128
------24 570 129
------24 630 130
------24 630 131
------24 630 132
------24 630 133
------24 630 134
------24 630 135
------24 630 136
------24 630 137
------24 630 138
------24 630 139
------24 630 140
------24 630 141
------24 630 142
------24 630 143
------24 630 144
------24 630 145
------24 680 146
------24 680 147
------24 680 148
Вопрос: Почему цикл в треде выполняется несколько раз за одну миллисекунду, потом выжидает 50-60 миллисекунд и процесс повторяется? Очень бы хотелось услышать мнение тех кто сталкивался с подобной проблемой или знает причину такого поведения. Есть ли решение заставить тело цикла в треде выполняться хотя бы раз в 10 мс? Кстати похожая картина наблюдается при установке VCL таймера в значение менее 60 мс, все равно интервал его работы остается 50-60 мс.
Потому что надо Synchronize() для визуальных компонентов использовать
Это первое.
Второе - зачем приводить результаты вывода программы - если они никак вопрос не дополняют?
Кроме того, система приоритетов винды гарантирует только то, что поток с высоким приоритетом будет получать процессор в свое распоряжение чаще, чем поток с более низким приоритетом - но никак не гарантирует как часто это будет происходить. Если необходимо иметь высокую точность - нужно использовать мультимедийные таймера - их точность срабатывания лежит гдето в пределах 10-30 мс.
Спасибо за объективную критику. Буду пробовать.