2009-04-17 26 views
7

Tôi đang sử dụng Delphi 2006 và Indy 10. Tôi tạo một biểu mẫu và thả xuống thành phần IdHttpServer. Tôi làm cho một sự kiện OnCreate đối với hình thức để thiết lập các máy chủ hoạt động, và tôi nhập những dòng này cho OnCommandGet của máy chủ:IdhttpServer Delphi/Indy không đa luồng?

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

Note Sleep trong 10 giây.

Sau đó tôi thử nghiệm với Firefox, sử dụng 2 trình duyệt. Tôi có cái đầu tiên kết nối với "localhost", và tôi nghe thấy một tiếng bíp ngay lập tức. Sau đó, tôi chuyển sang trình duyệt thứ 2 và kết nối với máy chủ cục bộ (trong vòng chưa đầy 10 giây) nhưng không phát ra tiếng bíp ngay lập tức. Nó chờ yêu cầu đầu tiên hoàn thành, sau đó phát ra tiếng bíp và chờ thêm 10 giây nữa.

Tôi nghĩ các thành phần này là đa luồng? Có một số tài sản tôi có thể thiết lập để làm cho nó hoạt động theo cách tôi nghĩ rằng nó sẽ (cả hai yêu cầu sẽ được trả lời ngay lập tức).

+1

Bạn có thể kiểm tra xem mọi thứ có đang chạy trên cùng một chuỗi không bằng cách trả về Định dạng ('% d% d', [MainThreadID, GetCurrentThreadID]) cho giá trị ContentText. Nếu nó thực sự đa luồng, hai giá trị bạn nhận được trong mỗi yêu cầu sẽ khác nhau và giá trị thứ hai của cả hai câu trả lời có thể cũng sẽ khác nhau. –

+0

Nếu tôi có thể quan tâm đến bạn theo cách khác: Tôi đã bắt đầu http://xxm.sourceforge.net/ để mở nguồn dự án mà tôi đang làm để giải quyết vấn đề này và các vấn đề tương tự. Tôi đã không thử nó trên Delphi 2006 được nêu ra, nó dựa trên Delphi 7, nhưng với một chút may mắn nó sẽ làm việc. –

Trả lời

9

Không Indy và TIdHTTPServer chịu trách nhiệm về hành vi này! Đó là webbrowser!

Firefox chia sẻ kết nối TCP cho các yêu cầu khác nhau tại cùng một máy chủ.

Vì vậy, Firefox sẽ tuần tự hóa 2 yêu cầu cho cùng một URI. Mở 2 trình duyệt khác nhau cùng một lúc (ví dụ: IE và Firefox), yêu cầu http://localhost/ trong cả hai và bạn sẽ nhận được kết quả mong đợi.

Và câu trả lời cho câu hỏi của bạn: Có, tất nhiên, mỗi sự kiện TIdHTTPServer.OnCommandGet được thực thi trong chuỗi "trình lên lịch" của riêng và có thể được thực hiện đồng thời.

+2

Vâng, đúng vậy! Tôi đã sử dụng trình duyệt Firefox và Internet Explorer, và nhận được kết quả mong đợi, cảm ơn rất nhiều! Đã xảy ra lỗi trong mã của tôi cho thấy hành vi tương tự, vì vậy khi tôi thấy Firefox cũng làm như vậy, tôi cho rằng mã của tôi hoàn hảo ... –

0

Tôi đã sử dụng Indy 10 idHTTPServer và nó đa luồng. Điều gì chặn ứng dụng của bạn có thể là lệnh "bíp" hoặc lệnh "ngủ". Bởi vì mặc dù thành phần là đa luồng, một số lệnh vẫn có thể khóa toàn bộ quá trình.

+0

Vì lý do nào đó Indy đang chờ yêu cầu đầu tiên hoàn thành trước khi nó kích hoạt OnCommandGet cho yêu cầu thứ 2. Nó giống như nó đã bao bọc các phương pháp OnCommandGet trong một phần quan trọng. Nó có thể được sử dụng các chủ đề khác nhau cho mỗi yêu cầu, nhưng đó là không sử dụng nếu Indy vẫn cháy chúng trong nối tiếp. Chức năng Beep and Sleep sẽ không chặn một số chủ đề KHÁC. –

+0

Vì tôi đã phát triển một ứng dụng hoàn chỉnh với các thành phần tôi khá chắc chắn nó là đa luồng. Nếu nó không phải là một vấn đề đăng mã của bạn và chúng ta hãy kiểm tra nó với nhau để tìm ra vấn đề;) – BYK

+1

Cảm ơn, hãy thử mã từ liên kết này, cho tôi biết những gì bạn thấy: http://www.benziegler.com/ stuff/IndyTest.zip –