Дык раз работаешь с КС, то нужно юзать SDK от Valve, а не пилить велосипед. https://developer.valvesoftware.com/wiki/Server_queries#Request_Format_3 И не нужно никаких таймеров и прочее, в Response Value тебе сразу вернут пинг
Не понимаю всё же там сказано A2A_PING Ping Code: отправляем FF FF FF FF 69 ÿÿÿÿi получаем FF FF FF FF 6A 00 ÿÿÿÿj. И что тут есть пинг ?
Дико извиняюсь, я тебя сбил. Действительно, этот пинг используется лишь для того, чтобы узнать, жив ли сервер, а не как нормальный пинг), но оформить в виде функции все-таки стоит. А потом сделать примерно так: PHP: varFreq, before, after : TLargeInteger;Elapsed: string;i:integer;beginQueryPerformanceFrequency(Freq);QueryPerformanceCounter(before);Ping_CS_Goldserver(host, port);QueryPerformanceCounter(after);Elapsed:= FormatFloat('0.0000', (after - before) / Freq) + ' sec';
Ничего страшного только скажи я правильно думаю ? Code: UDP.Connect('192.168.1.1','7777'); udp.SendString(Hextostr('FFBB4502B')); QueryPerformanceCounter(before); udp.RecvString(100); QueryPerformanceCounter(after); Elapsed:= FormatFloat('0.0000', (after - before) / Freq) + ' sec'; Memo1.lines.add(Elapsed); Тогда по сути Gettickcount тоже показывает, но только не верно показатели напрямую зависят от значения udp.RecvString(1000);
Да, все верно. А значения у тебя не верные из-за большого таймаута при получении ответа. Думаю нужно засекать пинг именно с поправкой на него
Так там же всё расписано: PHP: // Usage example: var i: integer; x: TIsaac; begin x.Create; for i:=1 to 20 do Memo1.Lines.Add(IntToHex(x.val, 8)); x.reSeed; // reseed exactly as in Create() for i:=1 to 20 do Memo1.Lines.Add(IntToHex(x.val, 8)); // get the same values end;
Везде примеры как открыть один файл в папки, есть примеры как работать со всеми файлами в определенной папки последовательно ?
Подскажите пожалуйста.. Никак не могу разобраться по многопоточности. Цель - запустить 10 потоков, если один закончил работу, создается новый. У меня почему-то зависает софтина.. При маленьком количестве входного материала, все работает, с увеличением входного материала, все больше начинает подвисать после старта.. P.S. По поводу подвисаний понял: Я создаю потоки от 1 до 10. Каждый поток увеличивает и уменьшает ' J ' по старту и концу.. Как мне отследить какой конкретно поток завершился ( под каким индексом ) , чтобы создать его снова ?? Я попробовал несколько вариантов ( работает, но все равно виснет на каком-то из потоков ), один из : Код Code: Tmythread = class(Tthread) private finish : integer; procedure TForm1.Button3Click(Sender: TObject); var i,x : integer; begin progressbar1.Max:=source.Count-1; i:=0; j:=1; setlength(thread,10); setlength(check,10); check[1]:=0; check[2]:=0; check[3]:=0; check[4]:=0; check[5]:=0; check[6]:=0; check[7]:=0; check[8]:=0; check[9]:=0; check[10]:=0; critical:=Tcriticalsection.Create; while i<source.Count-1 do begin // i // begin //jj if j+1<10 then begin //j for x:=0 to length(check) do begin // xx if check[x]=0 then begin check[x]:=1; thread[x]:=Tmythread.Create(true); thread[x].FreeOnTerminate:=true; thread[x].Flink:=source; thread[x].finish:=x; thread[x].Resume; inc(i); end; end; // xx end; // j end; //jj end; Execute (); begin try inc(j); check[finish]:=0; finally critical.Leave; end; end; И вообще, если я ставлю как счетчик, вывод i / j в лейбл в основном потоке, то ничерта не выводится, только в мемо.. А если я ставлю showmessage при exception, допустим если j=10 , то после вылета окна и нажатия кнопки окей, зависона не происходит и программа дорабатывает все до конца. Такой же трюк со sleep не проходит. Все равно зависает намертво. И вообще, как может быть j=10 , если он увеличивается, только если if j+1<10 !!! Я ничего не понимаю ( Буду очень благодарен за объяснение. Спасибо. Основной код : Код Code: unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, httpSend, Vcl.ComCtrls, SyncObjs, ssl_openssl; type TForm1 = class(TForm) Memo1: TMemo; OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; Button1: TButton; Button2: TButton; Button3: TButton; ProgressBar1: TProgressBar; Label1: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private declarations } public { Public declarations } end; Tmythread = class(Tthread) private Flink : string; procedure results; procedure show; protected procedure Execute; override; public // constructor Create(CreateSuspended: Boolean); end; var Form1: TForm1; source ,res : Tstringlist; thread : array of Tmythread; critical : TCriticalSection; j : integer; implementation {$R *.dfm} //constructor Tmythread.Create(CreateSuspended: Boolean); //begin // inherited Create(CreateSuspended); //end; procedure Tmythread.show; begin form1.progressbar1.Position:=form1.progressbar1.position+1; end; procedure Tmythread.results; begin res.Add(Flink); end; procedure TForm1.Button1Click(Sender: TObject); begin source := Tstringlist.create; res :=Tstringlist.Create; if OpenDialog1.Execute then begin source.LoadFromFile(OpenDialog1.FileName); end; end; procedure TForm1.Button2Click(Sender: TObject); begin if SaveDialog1.Execute then begin res.SaveToFile(SaveDialog1.FileName); end; end; procedure TForm1.Button3Click(Sender: TObject); var i : integer; begin progressbar1.Max:=source.Count-1; i:=0; j:=1; setlength(thread,10); critical:=Tcriticalsection.Create; while i<source.Count-1 do begin // i if j+1<10 then begin //j if j=1 then begin thread[j]:=Tmythread.Create(true); thread[j].FreeOnTerminate:=true; thread[j].Flink:=source; thread[j].Resume; inc(i); end else begin thread[j+1]:=Tmythread.Create(true); thread[j+1].FreeOnTerminate:=true; thread[j+1].Flink:=source; thread[j+1].Resume; inc(i); end; end; //j end; // i end; procedure Tmythread.Execute; var http: ThttpSend; www : string; code : Tstringlist; des,key : string; check : boolean; k : integer; begin critical.Enter; inc(j); //inc(x); critical.Leave; code:=TstringList.Create; http:=ThttpSend.Create; www:='lalalalala' try // try try // = http.Document.Clear; http.httpmethod('GET','http://'+www); except // = on E:exception do begin end; end; // = if http.ResultCode=200 then begin // code code.LoadFromStream(http.Document); des:=Copy(копирование); des:=Copy(des,0,pos('"',des)-1); key:=Copy(копирование); for k := 0 to form1.Memo1.Lines.count-1 do begin // for k if ((pos(form1.Memo1.Lines[k],des)>0) or (pos(form1.Memo1.Lines[k],key)>0)) then begin critical.Enter; results; critical.Leave; end; // for k end; end; // code finally // try sleep(1000); synchronize(show); critical.Enter; dec(j); critical.Leave; code.Free; http.Free; end; // try end; end. Долго рывшись в гугле нашел инфу для себя глупого : Пишет ( HiredKiller ) Цитата Ну окей. Вывел в главный поток таким образом. Все равно подвисает.. Как же быть то ? И так виснет. application.ProcessMessages; form1.progressbar1.Position:=form1.progressbar1.position+1; И так виснет. if i=form1.progressbar1.Position+30 then begin form1.progressbar1.Position:=i; end; if i=source.count-1 then begin form1.progressbar1.Position:=form1.progressbar1.max; end;
бегло просмотрел код, нельзя обращаться из потока к компонентам формы, разве что только из метода synchronize.
Возможно я не прав, но на сколько я знаю чтение разрешается. Я же не меняю содержимое. Ну хорошо. Но проблема не в этом, даже закомментировав весь этот блок проблема остается. На другом борде получил такой ответ : Не буду сюда копировать мои множественные попытки это сделать, все равно ничего не вышло. Помогите мне реализовать маленький код на основе моей задачи: Задавать список для обработки, чтобы 10 потоков обработали этот список. Как правильно приостановить поток, передать ему новый параметр для обработки и запустить снова ??
1 строка для 1 потока ? Вариант 1: Создать главный поток, который будет создавать дополнительные потоки посылая им новую строку, дополнительный поток после обработки строки завершается, сообщая об этом главному потоку. Тот смотрит, есть ли еще данные для обработки, и если есть, запускает новый поток Вариант 2 : Заранее создать 10 потоков и там сделать нечто подобное : while GetLine() do begin ...... end
Помогите составить код . Вывести на печать таблицу n значений функции y = ax + b ⋅ x + c 2 при изменении х от х1 до х2 с шагом h = (х2- х1)/n. Коэффициенты a, b, c, границы интервала х1, х2 и число n ввести с 7 клавиатуры. По таблице значений определить участки, содержащие корни уравнения, а также максимальное и минимальное значение функции. а = -1,14; b = -4,21; с = 3,25; x1=-2; x2=2; n=25. Заранее спасибо.
У кого есть компоненты tb2k 2.2 и TBX 2.2? Уже сил нет с этими придурошными компонентами. Неделю установить не могу(эти 2 последние остались). Их нужно пропатчить, а патч не работает нифига(тупо добавить в исходники должен код). И из-за этого у меня TBX не компилится.
Прими наши соболезнования. А теперь по-твоему мы должны залезть в гугл и искать те же самые файлы, что и у тебя?) - крч я даже не поленился пострадать этой херней с компонентами, вот пропатченые, если надо: http://fileshare.link/aed06b00daba7aaa/tb2k-2.2.2_p.rar - btw, ставил компоненты в 7 дельфю, под 10 виндой. все встало с первого раза, как надо
Помогите хоть кто-то из ГУРУ составить код программы для Pascal ABC NET. ---------------------------------------------------------------------------------- Вывести на печать таблицу n значений функции y = ax2 + b ⋅ x + c при изменении х от х1 до х2 с шагом h = (х2- х1)/n. Коэффициенты a, b, c, границы интервала х1, х2 и число n ввести с клавиатуры. По таблице значений определить участки, содержащие корни уравнения, а также максимальное и минимальное значение функции. а = -1,14; b = -4,21; с = 3,25; x1=-2; x2=2; n=25.