2016-10-31 2 views
0

J'écris un simple messager instantané d'égal à égal pour un réseau local. Il utilise un fichier ini pour analyser un UUID à utiliser comme identifiant sur le réseau. Le fichier ini est accessible via un objet QSettings. J'ai écrit des fonctionnalités pour permettre à plusieurs instances du programme d'être exécuté sur le même ordinateur. Lorsque le premier programme est exécuté, il lit le fichier ini pour la première entrée et s'il existe, il le lit et le remplace par "INUSE". Lors de la fermeture, il remplace la valeur de clé par l'UUID d'origine. Si une autre instance du programme lit le fichier ini et lit une INUSE comme première valeur de clé, elle en crée une autre après elle, la prend et place une balise INUSE sur la deuxième valeur de clé.Fichier ini Qt5 qui a besoin d'être mis à jour en cas de panne

Cela fonctionne très bien, cependant, si le programme se bloque, l'UUID qui était "INUSE" sera perdu et INUSE restera jusqu'à ce qu'il soit retiré manuellement. Comment puis-je comptabiliser un crash avec un système qui accomplit la même chose? J'ai regardé QLockFile mais je ne peux pas comprendre comment j'implémenterais un tel système.

Tous les commentaires sont appréciés.

Le format actuel du fichier ini est la suivante:

[uuid] 
1={uuid1} 
2={uuid2} 

tout programme 1 est en cours d'exécution

[uuid] 
1=INUSE 
2={uuid2} 

et après une fin normale du programme

[uuid] 
1={uuid1} 
2={uuid2} 

Essentiellement J'ai besoin est un moyen de préserver les données entre les exécutions de programme, mais aussi signaler à d'autres instances que ces données sont actuellement utilisées.

Répondre

0

Je pense que la première chose à faire est d'identifier pourquoi votre programme plante. Afin de choisir la meilleure solution. QLockFile vous permet d'empêcher plusieurs processus d'accéder au même fichier. Donc, cela ne vous sera utile que si le programme se bloque à cause de cela.

Quelle est toujours la raison pour laquelle votre programme crashe, je recommanderais l'utilisation des exceptions pour effectuer les actions correctes lorsque cela se produit:

try { 
    // Some of your code 
} catch (exception &e) 
{ 
    // Some error occured, do something about it. 
    // Like restoring your UUID. 
} 

Vous pouvez en savoir plus sur exception here, et vous pouvez toujours utiliser la version QT Qexception. J'espère que cela aide

+0

Merci pour le commentaire. Le programme ne plante pas à un point que je suis actuellement au courant, cependant, si jamais un message SIGKILL est envoyé sur unix ou l'équivalent sur Windows, la situation dans mon message d'origine apparaît – cbpeckles

+0

@cbpeckles Ensuite, votre question est une sorte de OMI mal formulé. Je ne pense pas que vous n'obtiendriez pas la réponse que vous voulez si vous ne la réparez pas. –