hmm....VB6 komponenter i trådar från .NET
Vet inte riktigt hur jag skall förklara mitt problem, men jag gör ett försök och hoppas att någon fattar vad jag menar.
Jag har en massa komponenter skrivna i VB6, dessa hämtar data från olika databaser, konverterar datan och tillsist skriver ner datan i en annan databas. Läsning och skrivning sker med ibland med RDO2.0 och ibland med ADO2.5.
Jag har sedan ett program i C# (.NET 1.1) som består av en massa lager, här kommer en förenklad uppbyggnad.
-----------------------------
FRONTEND:
GateManager (som visar alla mina gates)
Klient (kommunication till servern .NET Remoting)
MIDDLEWARE:
Server (kommunication till klient)
GateController (Hanterar alla GateRunners och Gates)
BACKEND:
GateRunners (hanterar alla GatePilots)
GatePilot (hanterar en gate)
Gate
---------------------
Gate är min komponent i VB6.
GatePiloten: ligger och körs hela tiden på datorn och kontrollerar när en gate skall köras (vid olika event, typ tidpunkt eller filevent) och när gaten skall köras så start GatePiloten gaten.
GateRunner: Hanterar alla GatePilots som finns på datorn.
GateControllern: Hanterar och vet på vilka maskiner de olika GateRunner/Gates finns och håller reda på att spara information till databas om i vilket status en gate befinner sig i just nu.
Det kan endast finnas EN GateController, medans det kan finnas många GateManager/GateRunner/Gates och det kan finnas flera på en och samma maskin.
Mitt problem är nu att jag vill kuna stoppa vilken gate som helst när jag vill. Detta betyder att jag väljer min gate och säger stop på den. Då skickar mitt program en förfrågning till min GatePilot (som körs i en egen tråd) och frågar om gaten lever (IsAlive) om den är det så försöker jag stänga ner min gate (ger den lite tid att avsluta vad den sysslar med) och sedan frågar jag GatePiloten igen om Gaten lever. Om detta är fallet så gör jag en Abort på Gaten (ger den ytterligare lite tid) och efter det så frågar igen om tråden lever.
Nu till mitt problem. I min VB6 komponent så loggar jag när man är i Terminateclass funktionen och ser att min komponent har kört denna funktionen. Min ändå så vägrar min tråd(Gate) att dö. Det lustiga (som alltid) är att det endast fallerar ibland.
När detta fallerar så kan jag inte heller stoppa andra Gates, det verkar som om de väntar på att min första Gate skall avslutats, och när den väl har dött så är avslutat de andra Gates direkt.
Så mina tankar lutar på att RDO/ADO inte riktigt släpper kopplingen till databas och eftersom den inte gör det, så kan inte min tråd/Gate dö. Dock borde mina andra komponenter inte påverkars om det inte är så att alla trådar/VB6 Komponenter använder EN och samma RDO/ADO instans, och eftersom då den första komponenten på något sätt lyckas hänga denna instans så blir de andra komponenterna hängandes och väntar på att den första komponenten skall dö.
Som märks så gripper jag efter halmstrå och hoppas att lösningen är mycket enklare än så. Så är det någon som har ett uppslag eller kanske råkat ut för samma problem.
MVH
Magnus