Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [Delphi] Indy 9 FTP Client - Un problemone

    Salve a tutti!

    Sto realizzando un sistema di FTP automatico inglobato in un'applicazione più complessa, ed utilizzo le InDY-Internet Direct 9.0.0.11 su Delphi 5. Recentemente mi è saltato fuori un problema spinoso, che in sostanza riguarda il fatto che a volte la connessione si "impianta" ma senza lanciare eccezioni di sorta, come se "stesse eseguendo un'istruzione lecita ma infinitamente lunga".

    Dopo vari tentativi di catturare il problema sono giuto alla conclusione di utilizzare i thread, e volevo sapere se qualcuno qui si è già cimentato in queste faccende e ha voglia di aiutarmi. Non parlo del thread in sé, quantoproprio dell'utilizzo delle InDY con i thread.

    Non mi dilungo di più ora per non tediarvi, in caso il 3d risultasse interessante potrò sempre inondarvi di messaggi in futuro. Se qualcuno vonesse invece rispondermi in privato si accomodi, un grazie in anticipo!

    piero.salandin@eriador.it
    Che il pelo cresca sempre fluente sui vostri piedi
    Bilbo
    Visita il sito della Società Tolkieniana Italiana

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,465

    Thread e VCL

    Non ho molta esperienza con i componenti Indy, ma ho fatto uso molto spesso dei thread e mi è capitato di dover utilizzare componenti al loro interno.

    Ciò che posso dirti (ma che forse sai già) è che la VCL, quindi la libreria di classi sulla quale si basano anche i componenti Indy, è stata progettata per un uso mono-thread.
    La scelta di questa impostazione nello sviluppo è giustificata dal fatto che la maggior parte delle applicazioni che vanno a creare gli sviluppatori contengono un thread solo, quello dell'applicazione stessa, e gestiscono le varie interazione con l'utente utilizzando gli eventi preposti o intercettando messaggi di Windows.

    Questa premessa è necessaria per scoraggiare qualsiasi uso di componenti che si trovano sui form da parte dei thread. Ciascun thread che vai a creare viene eseguito in modo asincrono rispetto al thread principale dell'applicazione (quello che raccoglie e gestisce i messaggi inseriti nella coda dell'applicazione stessa).
    Pertanto, una chiamata ad un metodo che appartiene ad un componente al quale si fa accesso sia dal thread principale che da quello secondario potrebbe generare una situazione di stallo o dare luogo ad effetti collaterali quasi impossibili da individuare, specialmente quando il programma viene eseguito passo per passo in fase di debugging.

    Il mio suggerimento è questo: creare un thread che esegua la stessa operazione che veniva precedentemente gestita dalla tua applicazione, ma creando dinamicamente i componenti Indy necessari all'interno del thread, senza utilizzare quelli eventualmente già presenti nei form dell'applicazione. In questo modo, eviti di doverti gestire l'accesso concorrente alle risorse condivise.
    Come secondo alternativa, potresti scegliere di gestire accessi concorrenti mediante dei Mutex (sono simili ai semafori), i quali servono a garantire che solo un thread alla volta prenda possesso di una risorsa e la rilasci al termine dell'elaborazione per renderla disponibile ad altri thread; nel nostro caso, la "risorsa" da proteggere è la chiamata al metodo che impiega lungo tempo per completarsi, ma sconsiglierei quest'ultima soluzione poichè il programma principale arriverebbe a bloccarsi di nuovo se tentasse di chiamare il metodo nel momento in cui è in uso dal thread secondario.

    Spero di non averti creato troppa confusione...

    Tutto questo a livello teorico, poi se ho indovinato la problematica e la possibile soluzione, dimmi qualcosa e vedremo come implementarla dal lato pratico.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3

    Re: Thread e VCL

    Originariamente inviato da alka
    Non ho molta esperienza con i componenti Indy, ma ho fatto uso molto spesso dei thread e mi è capitato di dover utilizzare componenti al loro interno.
    [...]
    Ciao!
    Sì, conosco piuttosto bene i thread e li ho usati con successo in altri casi. Quel che non conosco è il loro utilizzo all'interno del sistema delle Internet Direct; una cosa però te la posso chiedere:

    è possibile interrompere e distruggere un thread anche quando questo non vuole? perché ad esempio è inluppato in un ciclo senza fine o per qualche motivo impiantato lì da qualche parte?

    Sayonara
    Che il pelo cresca sempre fluente sui vostri piedi
    Bilbo
    Visita il sito della Società Tolkieniana Italiana

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,465
    Interromperlo quando vuole, credo proprio di no...o almeno credo che non si possa farlo senza conseguenze imprevedibili.

    Magari potresti eseguire questa operazione lanciando addirittura un programma esterno preposto, un nuovo task a tutti gli effetti, in modo da poterlo interromperlo senza conseguenze disastrose, anche se è da appurare che la connessione ad un determinato server non rimanga comunque bloccata anche se il task che l'ha avviata viene terminato.

    Il ciclo di istruzioni che vorresti interrompere è codificato in Pascal? Mi spiego, se tu vuoi interrompere un thread magari impostando un flag dall'esterno, potresti controllare il valore di questo flag inserendolo in un ciclo "while" all'interno del thread.

    Purtroppo non ho in mente altre soluzioni possibili...

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.