Domanda

Io uso la componente TIdCmdTCPServer di Indy 10 per realizzare la mia applicazione client-server. Il problema è che la richiesta da parte dei clienti può essere abbastanza complicata e che la parte grafica della mia applicazione server perde immediatamente la reattività. Dal Indy Documentazione , ho ottenuto che Indy:

  

crea e avvia discussioni ascoltatore per binding utilizzando la tpHighest priorità thread.

Posso cambiare questo comportamento?

È stato utile?

Soluzione

Come Rob sottolineato, non cambiano la priorità del thread di ascolto, abbassare la priorità dei thread di lavoro invece. Vi si può accedere nel gestore di OnConnect () del TIdCmdTCPServer esempio, in questo modo:

procedure TServerForm.IdCmdTCPServer1Connect(AContext: TIdContext);
begin
  // sanity checks need to go here
  TIdYarnOfThread(AContext.Yarn).Thread.Priority := tpLower;
end;

Altri suggerimenti

Impostazione della priorità più bassa per il thread di ascolto non risolverà il problema. Tutto il thread di ascolto sta facendo è l'ascolto, che non è un compito intensivo della CPU. Fino a quando una connessione arriva, quel filo non sta facendo nulla. Si può essere in grado di confermare che con uno strumento come Process Explorer; Penso che sia in grado di dimostrare l'utilizzo della CPU da thread.

Impostazione della priorità inferiore può effettivamente far apparire il server meno reattivo perché quando una connessione arriva, il filo di ascolto per la connessione verrà eseguito con priorità inferiore e non sarà in grado di lavorare sulla connessione subito. Il cliente dovrà aspettare ancora un po 'prima che il server inizia l'elaborazione di sua richiesta.

Le richieste non vengono gestiti nel thread di ascolto. I delegati filo ascoltatore maggior parte del lavoro ad altri thread. Se si dispone di una sola associazione TCP, allora avrete un solo thread di ascolto, ma è possibile elaborare molte connessioni simultanee. Ogni connessione viene gestita da un thread separato nonostante ci sia solo un ascoltatore.

In ogni caso, è possibile modificare la priorità per la gestione degli eventi OnBeforeListenerRun dell'oggetto server. Riceve un riferimento al TIdThread che rappresenta il thread di ascolto, in modo da poter assegnare un valore diverso alla proprietà Priority. Inoltre, è necessario il codice sorgente, così da poter entrare e cambiare la definizione della costante tpListener in IdGlobalCore.pas . Il codice utilizza tale valore, non tpHighest direttamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top