Je suis en train de cr=E9er une application qui affiche les images
provenant d'une camera. Ces images sont r=E9cup=E9r=E9es de fa=E7on p=E9rio=
dique
par tcp sous forme de buffer.
Pour la afficher, je mets =E0 jour l'image de mon interface avec
wx.StaticBitmap.SetBitmap(wx.BitmapFromBuffer(640, 480,
image_buffer)).
wx.Frame.Update()
Pour ne pas bloquer l'interface (qui contient d'autres
fonctionnalit=E9s), j'ai donc mis le code qui g=E8re la r=E9cup=E9ration de=
s
images, ainsi que le 'SetBitmap' pr=E9c=E9dent dans un thread... mais la
mise =E0 jour est tr=E8s saccad=E9e !
Quelqu'un aurait une fa=E7on plus propre de d=E9velopper ce programme ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
NicolasP
Charles a écrit :
Bonjour,
Je suis en train de créer une application qui affiche les images provenant d'une camera. Ces images sont récupérées de façon périodique par tcp sous forme de buffer.
Pour la afficher, je mets à jour l'image de mon interface avec wx.StaticBitmap.SetBitmap(wx.BitmapFromBuffer(640, 480, image_buffer)). wx.Frame.Update()
Pour ne pas bloquer l'interface (qui contient d'autres fonctionnalités), j'ai donc mis le code qui gère la récupération des images, ainsi que le 'SetBitmap' précédent dans un thread... mais la mise à jour est très saccadée !
Quelqu'un aurait une façon plus propre de développer ce programme ?
En programmation multithreads, la mise à jour des éléments de l'interface graphique ne doit être faite QUE par le thread gérant l'interface. En général, il s'agit du thread principal. Si cette règle n'est pas respectée, on ne peut pas prédire le comportement de l'interface. Donc, le thread 'travailleur' doit stocker les données dans un buffer et prévenir le thread 'interface' qu'il doit faire une mise à jour de l'affichage. Je dois avoir un exemple de code quelque part. Si tu es intéressé, je peux chercher et en publier des extraits ici.
Nicolas
Charles a écrit :
Bonjour,
Je suis en train de créer une application qui affiche les images
provenant d'une camera. Ces images sont récupérées de façon périodique
par tcp sous forme de buffer.
Pour la afficher, je mets à jour l'image de mon interface avec
wx.StaticBitmap.SetBitmap(wx.BitmapFromBuffer(640, 480,
image_buffer)).
wx.Frame.Update()
Pour ne pas bloquer l'interface (qui contient d'autres
fonctionnalités), j'ai donc mis le code qui gère la récupération des
images, ainsi que le 'SetBitmap' précédent dans un thread... mais la
mise à jour est très saccadée !
Quelqu'un aurait une façon plus propre de développer ce programme ?
En programmation multithreads, la mise à jour des éléments de l'interface graphique ne doit être faite QUE par le thread gérant l'interface. En général, il s'agit du thread principal. Si cette règle n'est pas respectée, on ne peut pas prédire le comportement de l'interface. Donc, le thread 'travailleur' doit stocker les données dans un buffer et prévenir le thread 'interface' qu'il doit faire une mise à jour de l'affichage.
Je dois avoir un exemple de code quelque part. Si tu es intéressé, je peux chercher et en publier des extraits ici.
Je suis en train de créer une application qui affiche les images provenant d'une camera. Ces images sont récupérées de façon périodique par tcp sous forme de buffer.
Pour la afficher, je mets à jour l'image de mon interface avec wx.StaticBitmap.SetBitmap(wx.BitmapFromBuffer(640, 480, image_buffer)). wx.Frame.Update()
Pour ne pas bloquer l'interface (qui contient d'autres fonctionnalités), j'ai donc mis le code qui gère la récupération des images, ainsi que le 'SetBitmap' précédent dans un thread... mais la mise à jour est très saccadée !
Quelqu'un aurait une façon plus propre de développer ce programme ?
En programmation multithreads, la mise à jour des éléments de l'interface graphique ne doit être faite QUE par le thread gérant l'interface. En général, il s'agit du thread principal. Si cette règle n'est pas respectée, on ne peut pas prédire le comportement de l'interface. Donc, le thread 'travailleur' doit stocker les données dans un buffer et prévenir le thread 'interface' qu'il doit faire une mise à jour de l'affichage. Je dois avoir un exemple de code quelque part. Si tu es intéressé, je peux chercher et en publier des extraits ici.
Nicolas
Charles
On 9 déc, 08:37, NicolasP wrote:
Charles a écrit :
> Bonjour,
> Je suis en train de créer une application qui affiche les images > provenant d'une camera. Ces images sont récupérées de façon p ériodique > par tcp sous forme de buffer.
> Pour la afficher, je mets à jour l'image de mon interface avec > wx.StaticBitmap.SetBitmap(wx.BitmapFromBuffer(640, 480, > image_buffer)). > wx.Frame.Update()
> Pour ne pas bloquer l'interface (qui contient d'autres > fonctionnalités), j'ai donc mis le code qui gère la récupératio n des > images, ainsi que le 'SetBitmap' précédent dans un thread... mais l a > mise à jour est très saccadée !
> Quelqu'un aurait une façon plus propre de développer ce programme ?
En programmation multithreads, la mise à jour des éléments de l'int erface graphique ne doit être faite QUE par le thread gérant l'interfac e. En général, il s'agit du thread principal. Si cette règle n'est pa s respectée, on ne peut pas prédire le comportement de l'interface. Don c, le thread 'travailleur' doit stocker les données dans un buffer et pr évenir le thread 'interface' qu'il doit faire une mise à jour de l'affi chage. Je dois avoir un exemple de code quelque part. Si tu es intéressé, je peux chercher et en publier des extraits ici.
Nicolas
Ah ouais, je veux bien un exemple, ça m'aiderait à réaliser ma p#?%!! *§ d'interface !
Merci.
Charles
On 9 déc, 08:37, NicolasP <nicol...@aaton.com> wrote:
Charles a écrit :
> Bonjour,
> Je suis en train de créer une application qui affiche les images
> provenant d'une camera. Ces images sont récupérées de façon p ériodique
> par tcp sous forme de buffer.
> Pour la afficher, je mets à jour l'image de mon interface avec
> wx.StaticBitmap.SetBitmap(wx.BitmapFromBuffer(640, 480,
> image_buffer)).
> wx.Frame.Update()
> Pour ne pas bloquer l'interface (qui contient d'autres
> fonctionnalités), j'ai donc mis le code qui gère la récupératio n des
> images, ainsi que le 'SetBitmap' précédent dans un thread... mais l a
> mise à jour est très saccadée !
> Quelqu'un aurait une façon plus propre de développer ce programme ?
En programmation multithreads, la mise à jour des éléments de l'int erface graphique ne doit être faite QUE par le thread gérant l'interfac e. En général, il s'agit du thread principal. Si cette règle n'est pa s respectée, on ne peut pas prédire le comportement de l'interface. Don c, le thread 'travailleur' doit stocker les données dans un buffer et pr évenir le thread 'interface' qu'il doit faire une mise à jour de l'affi chage.
Je dois avoir un exemple de code quelque part. Si tu es intéressé, je peux chercher et en publier des extraits ici.
Nicolas
Ah ouais, je veux bien un exemple, ça m'aiderait à réaliser ma p#?%!!
*§ d'interface !
> Je suis en train de créer une application qui affiche les images > provenant d'une camera. Ces images sont récupérées de façon p ériodique > par tcp sous forme de buffer.
> Pour la afficher, je mets à jour l'image de mon interface avec > wx.StaticBitmap.SetBitmap(wx.BitmapFromBuffer(640, 480, > image_buffer)). > wx.Frame.Update()
> Pour ne pas bloquer l'interface (qui contient d'autres > fonctionnalités), j'ai donc mis le code qui gère la récupératio n des > images, ainsi que le 'SetBitmap' précédent dans un thread... mais l a > mise à jour est très saccadée !
> Quelqu'un aurait une façon plus propre de développer ce programme ?
En programmation multithreads, la mise à jour des éléments de l'int erface graphique ne doit être faite QUE par le thread gérant l'interfac e. En général, il s'agit du thread principal. Si cette règle n'est pa s respectée, on ne peut pas prédire le comportement de l'interface. Don c, le thread 'travailleur' doit stocker les données dans un buffer et pr évenir le thread 'interface' qu'il doit faire une mise à jour de l'affi chage. Je dois avoir un exemple de code quelque part. Si tu es intéressé, je peux chercher et en publier des extraits ici.
Nicolas
Ah ouais, je veux bien un exemple, ça m'aiderait à réaliser ma p#?%!! *§ d'interface !
Merci.
Charles
NicolasP
> Ah ouais, je veux bien un exemple, ça m'aiderait à réaliser ma p#?%!! *§ d'interface !
J'ai retrouvé le code. Et en plus c'est simple...
------------------ Module Events.py : import wx
EVT_RESULT_ID = 100
class ResultEvent(wx.PyEvent): """Simple event to carry arbitrary result data.""" def __init__(self, data): """Init Result Event.""" wx.PyEvent.__init__(self) self.SetEventType(EVT_RESULT_ID) self.data = data
def OnMessage (self, event): data = event.data if data["Action"] == "AddText" : txt = data["Content"] line = data["Line"] column = data["Column"] . . .
Nicolas
>
Ah ouais, je veux bien un exemple, ça m'aiderait à réaliser ma p#?%!!
*§ d'interface !
J'ai retrouvé le code.
Et en plus c'est simple...
------------------
Module Events.py :
import wx
EVT_RESULT_ID = 100
class ResultEvent(wx.PyEvent):
"""Simple event to carry arbitrary result data."""
def __init__(self, data):
"""Init Result Event."""
wx.PyEvent.__init__(self)
self.SetEventType(EVT_RESULT_ID)
self.data = data
> Ah ouais, je veux bien un exemple, ça m'aiderait à réaliser ma p#?%!! *§ d'interface !
J'ai retrouvé le code. Et en plus c'est simple...
------------------ Module Events.py : import wx
EVT_RESULT_ID = 100
class ResultEvent(wx.PyEvent): """Simple event to carry arbitrary result data.""" def __init__(self, data): """Init Result Event.""" wx.PyEvent.__init__(self) self.SetEventType(EVT_RESULT_ID) self.data = data