Hoe een bestand weergeven dat eigendom is van een andere thread?

Ik probeer een applicatie te bouwen die in een GUI de inhoud van een logbestand laat zien, geschreven door een afzonderlijk programma dat ik door het subproces heen roep. De applicatie draait in Windows, en is een binary waar ik geen controle over heb. Ook zal deze applicatie (Actel Designer als het iemand iets kan schelen) zijn uitvoer naar een logbestand schrijven, ongeacht hoe ik de uitvoer van het subproces leid, dus het gebruik van een pijp voor de uitvoer lijkt geen optie te zijn. Waar het op neer komt is dat ik gedwongen word om uit een logbestand te lezen op hetzelfde moment dat er een andere thread naar schrijft. Mijn vraag is of er een manier is om de weergave van de GUI van de inhoud van het logbestand op een robuuste manier up-to-date te houden?

Ik heb het volgende geprobeerd:

  1. Naïef het bestand openen om periodiek te lezen terwijl het kind proces loopt, Python crasht (ik vermoed omdat het kind thread schrijft naar het bestand terwijl ik probeer het te lezen inhoud)
  2. Vervolgens probeerde ik een bestandsingang te openen naar de logbestandsnaam voordat ik het kindproces opriep met GENERIC_READ en SHARED_READ | SHARED_WRITE | SHARED_DELETE en lezen van dat bestand. Met deze benadering lijkt het bestand leeg

Bedankt voor alle hulp die u kunt bieden - ik ben geen professionele programmeur en ik trek er een week lang mijn haren over uit.

1
Dus de thread die het logbestand genereert heeft controle over wanneer het bestand wordt bijgewerkt? Als dat het geval is, zorg dan dat uw updating thread om te pauzeren wat het aan het doen is terwijl uw lees thread in het bestand leest, sluit dan het bestand in de lees thread en laat de updating thread opnieuw updaten. Nog een gedachte: laat het bestand in bezit zijn van een derde thread en vraag de eerste twee threads om die derde thread om informatie die ze nodig hebben.
toegevoegd de auteur Oliver, de bron
Het logbestand wordt gegenereerd door software van derden waar ik geen controle over heb - het is een .exe-bestand op de computer. Als het wordt gestart vanaf de opdrachtregel (of subproces), wordt er onmiddellijk een nieuwe thread gemaakt. Het klinkt alsof wat je beschrijft, controle zou moeten hebben over die voortgebrachte thread, en ik zie geen manier om dat te bereiken (open voor suggesties!)
toegevoegd de auteur muse_ee, de bron

1 antwoord

U moet zich registreren voor meldingen over bestandswijzigingen, zoals tail -f does (u kunt achterhalen welk systeem het gebruikt, door strace tail -f logfile uit te voeren).

pyinotify provides a Python interface for these file change notifications.

1
toegevoegd
Bedankt voor de suggestie! Ik denk niet dat pyinotify zal werken met Windows, maar ik heb wel een andere module gevonden die iets soortgelijks lijkt te doen genaamd Watchdog ( packages.python.org/watchdog ). Ik ga leren hoe ik dat moet gebruiken en laat je weten of deze aanpak werkt
toegevoegd de auteur muse_ee, de bron
Het gebruik van een op een bestand gebaseerde oplossing (Watchdog) loste mijn probleem op.
toegevoegd de auteur muse_ee, de bron