Tôi đang cố hiển thị màn hình giật gân và không đóng băng ứng dụng, trong khi nó kết nối với cơ sở dữ liệu. Các kết nối thông thường (tới MSSQL qua ADO) mất khoảng 300 msec và điều này không làm cho luồng chính hiển thị "không phản hồi" trên các cửa sổ.Hiển thị màn hình giật gân trong khi kết nối cơ sở dữ liệu (có thể mất nhiều thời gian) chạy
Tuy nhiên, trong trường hợp (a) lỗi mạng hoặc (b) lỗi cấu hình (tên máy chủ/máy chủ SQL không hợp lệ), mất 60 giây để hết thời gian chờ. Điều này không chỉ làm cho ứng dụng không đáp ứng, nhưng hầu như không thể hiển thị bất kỳ lỗi hoặc thông báo nào khi nó đóng băng. Tôi có thể bật lên một tin nhắn trước khi tôi bắt đầu kết nối nhưng thực sự không có giải pháp nào khi chuỗi chính bị chặn trong 60 giây.
Giải pháp dường như là di chuyển kết nối đến một chuỗi nền. Điều này dẫn đến đoạn mã sau:
một TThread-class mà làm cho các kết nối nền và một số SyncObj như một TEvent sử dụng để gửi một tín hiệu trở lại chủ đề chính.
Một vòng lặp trong các chủ đề chính với mã này:
BackgroundThread.StartConnecting; while not BackgroundThread.IsEventSignalled do begin Application.ProcessMessages; // keep message pump alive. end; // continue startup (reports error if db connection failed)
Đây có phải là cách đúng đắn để đi đâu? do dự của tôi liên quan đến các yếu tố sau của giải pháp trên:.
A. Tôi sẽ gọi Application.ProcessMessages, mà tôi xem xét một mùi code cực đoan (Điều này có thể là một ngoại lệ cho phép đối với quy tắc này)
B. Tôi đang giới thiệu các chủ đề trong quá trình khởi động ứng dụng và tôi lo lắng về việc giới thiệu các lỗi.
Nếu có ai thực hiện tham chiếu được biết là không có điều kiện chủng tộc, có thể thực hiện kết nối nền với ADO và được biết đến là phương pháp an toàn, điều đó thực sự hữu ích. Nếu không thì các mẹo chung hoặc ví dụ một phần là tốt.
Cho rằng kết nối bình thường chỉ mất 300ms, tại sao không thay đổi thời gian chờ (ví dụ: 1000ms)? – awmross
Cách hiển thị màn hình giật gân từ chủ đề nền: http: // stackoverflow.com/questions/388506/display-splash-screen-in-delphi-when-main-thread-is-busy – Harriv
Vấn đề này là một trong những trường hợp sử dụng chính để hiển thị giao diện người dùng từ một chủ đề khác với chủ đề GUI chính –