Bir iş parçacığına bir ileti göndermek ve iş parçacığında işlemek istiyorum. Bunu Delphi'de nasıl yapabilirim? Sanırım, PostMessage
gitmek için yoldur, ancak şimdiye kadar gördüğüm örnekler, diğer yoldan, yani iş parçacığından ana iş parçacığına kadardır.Delphi'deki ana iş parçacığından bir TThread'e nasıl mesaj gönderilir?
cevap
Herhangi bir kodu denemeyi ve yazmayı denemeyeceğim. Sadece bu eğiticiye bakın. Biraz eski ama çok iyi bir imho.Multithreading - The Delphi Way
İş parçacığınızda bir ileti döngüsü (muhtemelen gizli bir bildirim penceresiyle) olabilir ve ona bir Windows iletisi gönderebilirsiniz veya bunu yapmak için daha yerel (daha az GUI) bir yol kullanabilirsiniz. İş parçacığının beklediği ve gönderme iş parçacığının işaret ettiği bir el ile sıfırlama olayıyla birlikte bir kritik bölüm tarafından korunan bir sıra olarak.
Daha genel bir çözüm, bir üretici-tüketici kuyruğudur; klasik uygulamada, tüketicileri ve üreticileri takip etmek için birkaç semafor ve sıraya özel erişim için üçüncü bir semafor kullanılır; Bununla birlikte, nette daha optimal üretici-tüketici sıraları mevcuttur.
Ve unutmayın, çocuklar: Performans kullanmıyorsanız, Senkronize etmeyin(). :) –
Daha fazlasına katılmadım. Bu bir yorum yerine bir cevap olsaydı, oy vermiş olurdum. TThread'in dozu ve dontları hakkında hoş bir rant için bkz. Http://newsgroups.cryer.info/borland/public.delphi.internet.winsock/200507/0507273541.html – mghie
Neden yapmalısınız? Bu sadece ikincil bir iş parçacığında bir ileti döngüsü oluşturmak zorunda kaldım tek nedeni, ve iş parçacığı COM nesneleri kullandığını çünkü. Oleınitialize yapılan çağrılar() ve OleUnitialize() bir işareti ihtiyaç standart GetMessage() döngü vardır. Bu durumda, PostThreadMessage() kullanarak, yalnızca bu ileti dizisine ileti göndermeniz gerekir, çünkü normal engelleme senkronizasyon çağrıları mesaj döngüsünü etkileyebilir. Aksi takdirde, sadece yapmayın.
Eğer Delphi 2007 veya 2009'daysanız, Primož Gabrijelčič tarafından OmniThreadLibrary'a baktığınızdan emin olun, bu sizin işinizi daha kolay hale getirmelidir.
Neden bunu yapmalısınız? Örneğin, her 1000 msn bir sunucudan olayları yoklama bir iş parçacığım var ama yoklama oranını 5000msec olarak değiştirmem gerekiyor. Durdurmak ve daha sonra bu amaç için tekrar başlatmak çok fazladır. – grinner
@tdiop: Bunu başarmak için ileti dizisine gönderilecek bir mesajın gönderilmesi gerekmiyor, bunun için daha birçok başka yol var. İlham için diğer cevapları kontrol edin. – mghie
- 1. OpenGL'yi Android'deki ana iş parçacığından kullanma
- 2. İş parçacığından döndürülen değeri döndürür
- 3. Phoenix Controller'dan bir kanala nasıl mesaj gönderilir?
- 4. socket.io ile bir istemciye nasıl mesaj gönderilir
- 5. Ana UI iş parçacığındaki lambda/std :: işlevinin çağrılması bir arka plan iş parçacığından çağrılıyor
- 6. CUDA'daki ayrılma - Çekirdekdeki bir iş parçacığından çıkış
- 7. Komşu jvm'de akka sistemine nasıl mesaj gönderilir?
- 8. Arka plan iş parçacığından sunucuya eşzamanlı istek
- 9. mfc C++ Çalışan bir iş parçacığından ana kullanıcı arabirimine bir postmessage özel kullanıcı iletisini
- 10. ViewModel özelliklerine ayrı iş parçacığından erişme
- 11. NDK C++ iş parçacığından Java API nasıl aranır?
- 12. Genel bir Telegram kanalına php ile nasıl mesaj gönderilir?
- 13. OpenGL ES işlevleri neden başka bir iş parçacığından çağrılabilir?
- 14. WPF C# - Başka bir iş parçacığından liste kutusu düzenleme
- 15. Başka bir iş parçacığından dönen nesneler mi alıyorsunuz?
- 16. Arka plan iş parçacığından bir databoundview veri kümesini doğru güncelleştirin
- 17. Ana iş parçacığı
- 18. Ana iş parçacığı kapalı bir segue gerçekleştirmek için tamam mı?
- 19. WPF Uygulamasını UI olmayan iş parçacığından yeniden başlat
- 20. Devtool sayfasından arka plan sayfasına mesaj nasıl gönderilir?
- 21. Bir uygulamanın ana yönteminden Swing iş parçacığına geçmek gerekli mi?
- 22. İşlev yalnızca ana iş parçacığında çağrılabilir, neden?
- 23. Başka bir iş parçacığı tarafından yazıldıktan sonra ve bu iş parçacığı birleştirildikten sonra ana iş parçacığından bir değişkene erişmek güvenli midir?
- 24. Soketleri bir karta nasıl kaydederim ve onları başka bir iş parçacığından geçiririm?
- 25. Nasıl uyandırılır Başka bir iş parçacığından zaman aşımı süresi olmadan çağrı seç
- 26. İstemcinin iş parçacığından (threading, python) sunucunun değişkenini değiştirin
- 27. BlueTooth aracılığıyla bir dize nasıl gönderilir/gönderilir
- 28. iPhone: İş parçacığının ana iş parçacığı nasıl belirlenir?
- 29. Diğer iş parçacıkları tamamlanıncaya kadar ana iş parçacığı nasıl engellenir?
- 30. Bir Gmail hesabına nasıl giriş yapılır ve TIdIMAP4 ile bir posta kutusuna nasıl mesaj gönderilir?
Teşekkür ederiz. Kodgear'ın kendi sitesinin bile yanlış (eski) bir adresi vardır. – delphist
evet, öğretici biraz hareket etti! – Steve
Eğiticinin bağlantısı için teşekkürler. – samir105