Jag har en applikation som skall skicka meddelanden via MAPI. Programmet fungerar så att jag har en separat tråd som skickar meddelandet och sen använder jag PostThreadMessage till denna tråd med meddelandet. Hejsan. du behöver inget fönster för att skicka windows msgs till en tråd, det ända som krävs är att tråden har en message queue vilket windows skapar till dig. enligt dokumentationen om PostThreadMessage står det under remarks att msgs kan förloras om den mottagande tråden är i en modal message loop. Jag ser ingen anledning varför MAPI skulle befinna sig i en sådan, men det verkar ju ändå som att den förlorar ditt msgs.thread messages
Min applikation är i c++ men det här handlar mer om hur windows hanterar meddelanden.
Problemet jag har är att det verkar som om MAPI har sin egen meddelandehantering. Det innebär att om jag skickar ett meddelende till tråden medan den håller på med nåt MAPI anrop så försvinner meddelandet. (byter jag ut MAPI anropen mot Sleep() så fungerar det).
Antar att jag måste använda "hooks" eller events istället men det gör det hela så mycket mer komplicerat. Hittar inget i MAPI dokumentationen om detta och det gör mig lite fundersam över vad man kan använda thread messages till.
Hur gör man normalt för att kommunicera med worker threads.Sv: thread messages
Jag (tillsammans med andra) implementerade worker threads i produkten SpatialAce (http://www.spatialace.com) som läste in data från disk asynkront med att uppdateringen på skärmen körde på som vanligt i GUI-tråden.
Vi använde då inte PostThreadMessage alls för att kommunicera mellan trådarna, utan använde events för att synkronisera (arbetartråden gjorde WaitFor[Multiple|Single]Objects) och sedan så kommunicerade trådarna via andra trådsäkrade datastrukturer (en stl::list i vårat fall).
Det kändes enklare tankemässigt tyckte jag eftersom jag tidigare gjort liknande saker i t.ex. Java. Dessutom så kommunicerar trådmeddelanden för worker threads med dolda fönster, vilket kan ge andra problem (märkliga bieffekter) om t.ex. COM eller .NET är inblandat (COM och .NET verkar intern ha dolda fönster).
Ett annat tips med worker threads: glöm inte att du inte får släppa ifrån dig exceptions, då de annars orsakar Access Violations.
/AndreasSv:thread messages
Sv: thread messages
Vad ska du då göra? Du kan välja att använda Win32 events för att kommunicera mellan trådarna även om det inte är den mest optimala lösningen ur prestanda alternativ.