2011-09-20 33 views
5

Tôi muốn tạo một cửa sổ trên một chuỗi và sau đó chuyển HWND đó sang một trong số bất kỳ chuỗi nào mà nó sẽ thực thi. Chương trình của tôi sẽ có nhiều cửa sổ như vậy. Điều này có thể hoặc là API Win32 không được thiết kế cho điều này?Cửa sổ Win32 có an toàn không?

+0

Vì vậy, bạn muốn tạo nội dung nào đó trên một chuỗi và sau đó xóa nó trên một chuỗi khác và bạn không thấy vấn đề với ý tưởng đó? – AJG85

+1

@AJG: Không có vấn đề gì với 'new' /' delete'. Hoàn toàn hợp lý để tự hỏi về các tài nguyên khác. – MSalters

+0

@MSalters: Phụ thuộc vào việc triển khai nhưng không có đề cập đến phân bổ đống. Chỉ cần đưa nó lên trong trường hợp nó bị bỏ qua. – AJG85

Trả lời

6

Không, điều này là không thể. Chủ đề mà một cửa sổ sử dụng cho vòng lặp tin nhắn của nó (những gì bạn gọi là "thực hiện trên") được xác định tại thời điểm cửa sổ được tạo ra. Bạn có thể tạo nhiều chủ đề và bắt đầu các vòng tin nhắn từ chúng (và do đó tạo ra các cửa sổ trên chúng), nhưng điều này thường được coi là nguy hiểm.

+4

Chăm sóc downvoter để bình luận? –

+0

Một số anh chàng đến và downvoted tất cả mọi thứ với một mũi tên xuống trên trang này, tôi đã cố gắng để hoàn tác nó –

+1

Không downvoter ở đây, nhưng tôi muốn biết: Làm thế nào/tại sao sử dụng nhiều chủ đề GUI 'nguy hiểm'? Nó có lẽ là một thực hành tiên tiến - không phải cái gì bạn cần phải làm trong một Hello World trung bình hoặc ứng dụng hộp thoại đơn giản, nhưng không nguy hiểm mà tôi biết. Đó là thực tế phổ biến trong nhiều ứng dụng phức tạp (Explorer, IE, có khả năng văn phòng quá). – BrendanMcK

2

Không, không có kiểm tra đồng thời về các cuộc gọi đó.

9

Có, ở một mức độ nhất định.

Bạn có thể gửi và đăng tin nhắn tới HWND từ bất kỳ chuỗi nào.

http://msdn.microsoft.com/en-us/library/ms644944(v=VS.85).aspx

Cố gắng để cấu hình giao diện người dùng (ví dụ: thêm điều khiển) từ thread khác sẽ kết thúc tồi tệ. Tuy nhiên, nếu bạn gửi tin nhắn cửa sổ, bạn có thể chắc chắn rằng thông báo sẽ được xử lý trên chuỗi tạo.

+0

Đây là câu trả lời đúng nhất - Win32 thực sự là người khoan dung nhất trong các khung công tác giao diện người dùng liên quan đến truy cập chéo, win32k.sys cố gắng làm mọi thứ hoạt động. Tuy nhiên, nó vẫn là một ý tưởng tốt hơn để giả vờ bạn không biết điều này, và hoạt động như thể các đối tượng là chủ đề được tạo ra –

+0

Có. "Chủ yếu là hoạt động" không phải là một mô tả tôi muốn có liên quan đến bất cứ điều gì mà tôi viết :). Dường như nếu bạn không thực sự nghiêm ngặt về Gửi/Đăng tin nhắn (hoặc các đối tác thế kỷ 21 của họ) những thứ kỳ lạ đôi khi chỉ xảy ra. –

+0

Đây là câu trả lời tốt hơn, bởi vì gửi tin nhắn là những gì tôi quan tâm. –

2

Có hai cuộc gọi quan trọng là must be called from the same thread: CreateWindowGetMessage (hoặc tương đương tương ứng). Giải pháp của bạn sẽ không, vì vậy nó sai.

Bạn có thể gọi PostMessage trong bất kỳ chủ đề nào. SendMessage có phần nguy hiểm vì nó chặn trong kịch bản chuỗi chéo và có thể bế tắc.

+0

Tôi đã có một tình huống ngày hôm nay, nơi một số mã trên một chuỗi công nhân được gọi là SendMessage từ một phần quan trọng và bế tắc. Đã lãng phí một giờ nhìn vào nó, tôi nghĩ rằng nó thận trọng hơn để chỉ cần đặt chế biến vào thread UI và PostMessage hướng dẫn của tôi trên. – locka

Các vấn đề liên quan