سؤال

أنا أستخدم Delphi 2006 و Indy 10. أقوم بإنشاء نموذج واستسلام مكون IDHTTPServer. أقوم بإجراء حدث OnCreate للنموذج لتعيين الخادم النشط، وأدخل هذه الأسطر للحصول على OnCommAndget الخادم:

procedure TForm3.IdHTTPServerCommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
   Beep;
   Sleep(10000);
   AResponseInfo.ContentText := DateTimeToStr(Now);
end;

لاحظ النوم لمدة 10 ثوان.

ثم يمكنني اختبار مع فايرفوكس، باستخدام 2 متصفحات. لدي أول اتصال واحد ب "LocalHost"، وأسمع صوتا على الفور. أنا ثم علامة التبويب إلى المتصفح الثاني، ولديها الاتصال باللغة المحلية (في أقل من 10 ثوان)، لكنها لا تصدر على الفور. ينتظر الطلب الأول لإكماله، ثم الصفافير، وينتظر 10 ثوان أخرى.

اعتقدت أن هذه المكونات كانت متعددة الخيوط؟ هل هناك بعض الممتلكات التي يمكنني ضبطها لجعلها تتصرف بالطريقة التي اعتقدت أنها ستكون (ستجيب على كلا الطلبين على الفور).

هل كانت مفيدة؟

المحلول

ليس إندي و TIdHTTPServer هو المسؤول عن هذا السلوك! انها webbrowser!

يشارك Firefox اتصال TCP طلبات مختلفة في نفس الخادم.

لذلك، يستسلسل فايرفوكس الطلبات 2 لنفس URI. افتح 2 متصفخا مختلفة في نفس الوقت (على سبيل المثال IE و Firefox)، طلب http://localhost/ في كليهما وسوف تحصل على النتيجة المتوقعة.

والإجابة على سؤالك: نعم، بالطبع، كل TIdHTTPServer.OnCommandGet يتم تنفيذ الحدث بطريقة "جدولة" الخاصة، ويمكن تنفيذها في وقت واحد.

نصائح أخرى

واجهة المستخدم الرسومية تستجيب خلال هذه العشر ثوان، لذلك فهي مؤشرات متعددة للعمليات الطويلة وضع التعليمات البرمجية الخاصة بك في مؤشر ترابط آخر - وسوف تحصل على ما تريد

unit uSomeThread;

interface

uses
  System.Classes;

type
  TSomeThread = class(TThread)
  protected
    procedure Execute; override;
  end;

implementation


procedure TSomeThread.Execute;
begin
  //  Beep;
  Sleep(10000);
end;

end.

...........

    procedure TServer.IdHTTPServerCommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
  cContext: TClientContext;
  t: TSomeThread;
begin
//  Beep;
//  Sleep(10000);

  t := TSomeThread.Create(true);
  t.FreeOnTerminate := true;
  t.Start;

  AResponseInfo.ResponseNo := 200;
  AResponseInfo.CacheControl := 'no-cache';
  AResponseInfo.CustomHeaders.Add('Access-Control-Allow-Origin: *');
  AResponseInfo.ContentText := 'ok';
  AResponseInfo.ResponseNo := 200;
  AResponseInfo.WriteContent;
  Beep;

end;

لقد استخدمت إندي 10 Idhttpserver و يكون multithread. ما هو حظر التطبيق الخاص بك قد يكون "صوت التخدير" أو الأمر "النوم". لأنه على الرغم من أن المكون هو multithread، فقد لا تزال بعض الأوامر قفل العملية برمتها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top