2012-08-29 10 views
5

Sử dụng thành phần TSQLConnection trong Delphi XE2 để kết nối với máy chủ DataSnap. Vấn đề của tôi là tôi muốn hủy bỏ nỗ lực kết nối nếu chúng tôi không thể kết nối sau 3 giây, tuy nhiên việc thiết lập thuộc tính ConnectTimeout của trình điều khiển dường như không có bất kỳ tác động nào (nó vẫn chờ khoảng 20 giây). trước khi bỏ cuộc).Làm thế nào để hủy bỏ một nỗ lực kết nối TSQLConnection trong XE2?

Tôi đang chạy điều này bên trong một chuỗi và vì vậy tôi có thể đăng thông báo lên chuỗi (cách hàng đợi thông báo chuỗi được phụ thuộc, tôi giả sử, về cách tạo cuộc gọi chặn này). Ngay cả khi trình xử lý tin nhắn luồng của tôi chạy, tôi không chắc chắn làm thế nào tôi sẽ ngắt cuộc gọi chặn để đặt thuộc tính TSQLConnection.Connected (được đặt trong phương thức Thực thi của chuỗi).

Tôi không muốn gọi TerminateThread vì điều này có vẻ quá mức cần thiết và sẽ để lại (nếu tôi hiểu chính xác) bộ nhớ được cấp phát cho ngăn xếp của chuỗi. Bất kỳ ý tưởng về cách làm gián đoạn quá trình kết nối này, hoặc truy cập các thành phần Indy cơ bản và đặt rõ ràng thời gian chờ kết nối sẽ được đánh giá cao.

Cảm ơn!

fConnection := TSQLConnection.Create(nil); 
with fConnection do 
begin 
    DriverName := 'DataSnap'; 
    Params.Values['CommunicationProtocol'] := 'tcp/ip'; 
    Params.Values['DatasnapContext'] := 'datasnap/'; 
    Params.Values['HostName'] := '127.0.0.1'; 
    Params.Values['Port'] := '211'; 
    Params.Values['ConnectTimeout'] := '3000'; 
    KeepConnection := true; 
    LoginPrompt := true; 
end; 

// Where it blocks for up to 20 seconds (if host unavailable) 
fConnection.Connected := True; 

Trả lời

1

tôi nghĩ về này và nếu ConnectTimeout không làm việc thì bạn có thể giải quyết việc này theo cách khác

đầu tiên trước khi kết nối thử đến máy chủ ping dest bởi thành phần như Indy (nếu đây không phải là localhost; -)) hoặc tốt hơn hãy thử cổng dịch vụ telnet (cũng bằng Indy) - tôi cho rằng đây là cách đơn giản nhất mà bạn có thể làm bây giờ mà không cần phải hủy bỏ chủ đề

+0

Vấn đề là tường lửa cần phải cho phép ICMP. Tôi nhận ra ví dụ cho thấy một kết nối đến localhost nhưng tôi không nghĩ rằng bằng cách sử dụng một giao thức riêng biệt là sửa chữa trong trường hợp này. Hãy cho tôi biết nếu tôi đã hiểu lầm. – Duncan