PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV Mobile 2024 → Gpssuitdeplacement dans thread
Gpssuitdeplacement dans thread
Débuté par Monsieur AURAY-LORIVAL, 30 mar. 2017 19:28 - 9 réponses
Membre enregistré
64 messages
Popularité : -1 (1 vote)
Posté le 30 mars 2017 - 19:28
Bonsoir,
Petite question technique, je veux faire un suivi GPS sur mon appli et j'aimerai que ça soit assez fluide sans bloquer l'utilisateur.
Est il utile de mettre la fonction gpssuitdeplacement dans un thread à part ?
Si oui c'est la fonction qu'on appelle par le thread ou est ce la procédure appelée par la fonction qui crée le thread ?

Merci pour cette précision
Posté le 30 mars 2017 - 21:02
Coucou,

Je pense que sa ne sert a rien.

GPSSuitDéplacement(<Nom de Procédure> [, <Délai> [, <Distance>]])

Cette procédure est de la forme :
PROCEDURE <Nom de la Procédure>(<Position>)

Du coup tu va avoir un effet "d'appel" de GPSSuitDéplacement d que des données utilise vont etre disponible, te prend la tete, il se la sont prise pour toi ;)

Charly
Membre enregistré
637 messages
Popularité : +36 (36 votes)
Posté le 31 mars 2017 - 07:35
Bonjour,

Aucun intérêt puisque GPSSuitDéplacement n'est appelé qu'une fois.

Par contre, tu peux mettre la fonction appelée dans la Callback en thread. Ce n'est pas une obligation mais peut-être utile si par exemple tu enregistres les données de géolocalisation dans un fichier en C/S. Perso je le ferais.

Cdlt - Eric.

--
Eric DELATTRE
http://www.yoosite.fr
Membre enregistré
64 messages
Popularité : -1 (1 vote)
Posté le 03 avril 2017 - 23:56
Bonsoir, merci à vous pour vos réponses, je les prends en compte et reviens sur le sujet car j'utilise la fonction mais je trouve que c'est vraiment aléatoire, l'actualisation de la position n'est pas fluide: un coup ça met 2 secondes, un coup 10.
Sans être aussi précis, y'a pas moyen de faire quelque chose d'aussi fluide que sur maps ou waze ?
A chaque actualisation, je repositionne un marqueur sur un champ carte.

Mon appel de fonction et je précise que la callback n'est pas dans un thread (pour l'instant):
GPSSuitDéplacement(_RécupèrePosition,100,1)


Merci à vous
Membre enregistré
637 messages
Popularité : +36 (36 votes)
Posté le 04 avril 2017 - 09:43
Bonjour,

Préciser 1 mètre en distance n'a pas d'intérêt considérant la précision du système actuel. Autant ne rien mettre et laisser par défaut. Auquel cas, vous aurez 5 mètres.

Par ailleurs, sans voir ce qu'il y a dans votre procédure _RécupèrePosition il sera difficile de vous répondre...

Quels sont aussi vos conditions de mesure ? Dans un bureau ? En plein air ? ....

Cdlt - Eric.

--
Eric DELATTRE
http://www.yoosite.fr
Membre enregistré
64 messages
Popularité : -1 (1 vote)
Posté le 04 avril 2017 - 19:03
Voici ma procédure de callback:
Procedure ActualisePosition(Moi est une geoPosition)

gPositionActuelle = Moi
Multitâche(-1)
SI gbBloqueGPSAuto=Faux ALORS
MonMarqueur..ActionClic="VousEtesIci"
MonMarqueur..Position=gPositionActuelle
MonMarqueur..Nom="PositionActuelle"
SI PAS CarteModifieMarqueur(FEN_Carte.CARTE,MonMarqueur) ALORS
CarteSupprimeMarqueur(FEN_Carte.CARTE,"PositionActuelle")
CarteAjouteMarqueur(FEN_Carte.CARTE,MonMarqueur)
FIN
Multitâche(-1)
FEN_Carte.CARTE..Zoom=zoomAdapteTaille
FEN_Carte.CARTE..Valeur=gPositionActuelle
FIN


Et je ne peux pas la mettre dans un thread car je ne peux pas modifier des éléments (marqueurs et autres) depuis un autre thread que le principal.
J'ai par ailleurs enlevé le paramètre de distance minimale dans l'appel.
Membre enregistré
217 messages
Popularité : +12 (12 votes)
Posté le 04 avril 2017 - 19:42
Bonjour
Pourquoi ne pas faire appel à la fonction Cartesuitdeplacement au lieu de GpsSuitDeplacement puisque dans votre procedure callback vous ne faite quafficher la position actuelle?
Membre enregistré
64 messages
Popularité : -1 (1 vote)
Posté le 04 avril 2017 - 23:04
Merci beaucoup, je ne connaissais pas du tout cette fonction, elle est très mal référencé, je cherchais dans les fonctions GPSXX
Ca m'a l'air beaucoup plus cohérent avec mon utilisation et plus fluide, y'a même la flèche de direction!
Par contre j'ai une dernière question, cette fonction m'affiche un marqueur par défaut (un rond bleu), comment changé cette image, ou est-elle située ? Dans le SDK ou l'installation Windev ?

Merci
Membre enregistré
217 messages
Popularité : +12 (12 votes)
Posté le 04 avril 2017 - 23:36
Aucune idée désolé
SI vous réussissez à personnaliser ce marqueur, ça m'intéresserait !
Membre enregistré
39 messages
Popularité : +4 (4 votes)
Posté le 05 avril 2017 - 09:26
Je vais vous donnée un petit bout de code SQL qui vous permettra de convertir votre longitude et latitude en 3 dimension (x,y,z) afin de connaitre les distances entre chaque points, ou chaque personnes par exemple.
J'avais déjà donnée cette exemple sur un autre poste.

Partie Update d'un fichier par rapport à un id via un WS
Procedure udpate_gps(nUserid est un entier,MapositionLatitude est un réel,MapositionLongitude est un réel)
SI MapositionLatitude <> 0 ET MapositionLongitude <> 0 ALORS
SI HLitRecherchePremier(utilisateurs,IDutilisateurs,nUserid) ALORS
SI HTrouve() = Vrai ALORS
utilisateurs.Latitude = MapositionLatitude
utilisateurs.Longitude = MapositionLongitude
SI HModifie(utilisateurs,hNumEnrEnCours) ALORS
ReqClient est une Source dede Données
sMaReq est une chaîne = [
UPDATE utilisateurs SET
coord_x=(6378 * COS(RADIANS(Latitude))) * COS(RADIANS(Longitude)),
coord_y=(6378 * COS(RADIANS(Latitude))) * SIN(RADIANS(Longitude)),
coord_z=6378 * SIN(RADIANS(Latitude))

WHERE utilisateurs.IDutilisateurs = %1
]
sMaReq = ChaîneConstruit(sMaReq,nUserid)
SI HExécuteRequêteSQL(ReqClient,Trouvez,hModifieFichier+hRequêteDéfaut,sMaReq) ALORS
RENVOYER Vrai
SINON
RENVOYER Faux
FIN

SINON
RENVOYER Faux
FIN

SINON
RENVOYER Faux
FIN
SINON
RENVOYER Faux
FIN
SINON
RENVOYER Faux
FIN


Partie envoyer une notification au utilisateur à coté de moi même via un WS

Procedure Envoi_Autour(bTrouve est un booléen,animalid est un entier, coord_x est une chaîne, coord_y est une chaîne, coord_z est une chaîne)

// Variables
tabTokensInvalides est un tableau de Buffer
nNbTokensInvalides est un entier
sToast est une chaîne
sMaReq est une chaîne
coord_x = Remplace(coord_x,",",".")
coord_y = Remplace(coord_y,",",".")
coord_z = Remplace(coord_z,",",".")

// android Push
googleapi est une chaîne = "CLEF API GOOGLE"
tabIdentifiantsAEnvoyerAndroid est un tableau de Buffers

// IOS Push
tabIdentifiantsAEnvoyerIOS est un tableau de Buffers
tabMonCertif est un tableau dede Certificats
tabMonCertif = CertificatCharge("chemin/vers/certificat/Certificats.p12","xxxxxxxxxx")

AnimalPerdu,MonUtilisateurs est une Source dede Données
sMaReq = [
SELECT utilisateurs.Latitude AS Latitude,utilisateurs.Longitude AS Longitude,utilisateurs.coord_x AS coord_x,utilisateurs.coord_y AS coord_y,
utilisateurs.coord_z AS coord_z,
utilisateurs.Type_tel as Type_tel,
utilisateurs.Identifiant_notif AS Identifiant_notif,
SQRT(((Power(( utilisateurs.coord_x-%1),2)+Power( ( utilisateurs.coord_y - %2) , 2) ) + Power( ( utilisateurs.coord_z - %3 ) , 2) ) ) AS DISTANCESS
FROM
utilisateurs
WHERE
DISTANCESS <= utilisateurs.distance
]
sMaReq = ChaîneConstruit(sMaReq,coord_x,coord_y,coord_z)

sReq est une chaîne = [
SELECT Animal_possédé.Nom AS Nom FROM Animal_possédé WHERE IDAnimal_possédé = %1
]
sReq = ChaîneConstruit(sReq,animalid)

//RECUP ANIMAL NOM
HExécuteRequêteSQL(AnimalPerdu,Trouvez,hRequêteDéfaut,sReq)

//RECUP ID
HExécuteRequêteSQL(MonUtilisateurs,Trouvez,hRequêteDéfaut,sMaReq)
// On gère le fait que les notifications PUSH ne peuvent avoir au maximum que 1000 destinataires
// S'il y a plus de destinataires il faut envoyer plusieurs messages.

SI HNbEnr(MonUtilisateurs) > 0 ALORS
POUR TOUT MonUtilisateurs
SI MonUtilisateurs.Identifiant_notif <> "" ALORS
SI MonUtilisateurs.Type_tel= "A" ALORS
Ajoute(tabIdentifiantsAEnvoyerAndroid, MonUtilisateurs.Identifiant_notif)
SINON
Ajoute(tabIdentifiantsAEnvoyerIOS, MonUtilisateurs.Identifiant_notif)
FIN
FIN
FIN

SI tabIdentifiantsAEnvoyerAndroid..Occurrence > 0 ALORS
SI PAS NotifPushEnvoie(ConstruitNotification(0,AnimalPerdu.Nom,"Animal perdu ",animalid,2),tabIdentifiantsAEnvoyerAndroid,googleapi,tabTokensInvalides) ALORS
FIN
FIN

SI tabIdentifiantsAEnvoyerIOS..Occurrence > 0 ALORS
SI PAS NotifPushEnvoie(ConstruitNotification(1,AnimalPerdu.Nom,"Animal perdu ",animalid,2), tabIdentifiantsAEnvoyerIOS, tabMonCertif[1], typeServiceIOSProd) ALORS
FIN
FIN

FIN
// L'envoi est terminé
// Toast indiquant le résultat
SI nNbTokensInvalides > 1 ALORS
sToast = ChaîneConstruit("%1 tokens invalides supprimés",tabTokensInvalides..Occurrence)
SINON
sToast = ChaîneConstruit("%1 token invalide supprimé",tabTokensInvalides..Occurrence)
FIN
RENVOYER ChaîneConstruit("Notification envoyée avec succès à %1 utilisateurs.",(tabIdentifiantsAEnvoyerAndroid..Occurrence+ tabIdentifiantsAEnvoyerIOS..Occurrence)) + RC + RC + sToast


J’espère ce petit bout de code vous sera utile

Cordialement