Vai al contenuto
PLC Forum


Funzione Sleep In Asp


einsteinmc2

Messaggi consigliati

Salve a tutti, ho bisogno che qualcuno mi dia una mano con un problemino in ASP wallbash.gif .

Ho un ciclo che manda 400 mail, adesso la cosa che voglio fare è usare la funzione "sleep" per fermare il ciclo per 5 secondi tra ogni mail, ma il tutto non funziona, ho cercato in rete però sembra che ci siano problemi con questa funzione, qualcuno di voi sarebbe cosi gentile da darmi info???

Grazie a tutti.

Link al commento
Condividi su altri siti


premetto che sono bianco di asp. credo che sia problema di logica di programmazione ma poi potrei sbagliarmi....

Non potresi aggirare il problema inizializzando un'ulteriore variabile di "attesa" da inserire dentro un ciclo for?

esempio in linguaggio c ma implementabile ovunque:

for (indice=1;indice<=totale && attesa=valore;indice++)

{

mandamail();

}

indice++;

Link al commento
Condividi su altri siti

ovviamente ....

non considerare quell'ulteriore incremento finale indice++....

ho mischiato la for con la while.... perdonami

quindi più correttamente

for (indice=1;indice<=totale && attesa=valore;indice++)

{

mandamail();

}

Link al commento
Condividi su altri siti

Frenz allora giusto per essere più dettagliato nella cosa, ti posto la sezione di codice dovrei modificare.....

'Send email (CDOSYS version).
    
    if mailComp = "CDOSYS" then
      arrayemail = split(strEmail, ",")

indice = 0
max = UBOUND(arrayemail)


WHILE NOT i> MAX


      set cdoMessage = Server.CreateObject("CDO.Message")
      set cdoConfig = Server.CreateObject("CDO.Configuration")
      cdoConfig.Fields("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
      cdoConfig.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserver") = smtpServer
      cdoConfig.Fields.Update
      set cdoMessage.Configuration = cdoConfig
      cdoMessage.From =  fromAddr
      cdoMessage.To = arrayemail(i)
      cdoMessage.Subject = subject
      If Request.Form("version") = "html" Then
        cdoMessage.HtmlBody = strEmailMsg
      Else
        cdoMessage.TextBody = strEmailMsg
      End If
      on error resume next
      cdoMessage.Send
      if Err.Number <> 0 then
        SendMail = "Email send failed: " & Err.Description & "."
      end if
      set cdoMessage = Nothing
      set cdoConfig = Nothing

i = i + 1
WEND

END IF

Come vedi adesso devo trovare un modo che subito èrima o subito dopo l'incremento della variabile i mi stoppi il tutto per n secondi.

La funzione sleep da problemi in ASP, HO provato ma non funge wallbash.gif

Modificato: da einsteinmc2
Link al commento
Condividi su altri siti

ok.... da quel che ho ho capito dal codice (ripeto essere totalmente niubbo di asp) ti hai un array nel quale è contenuto l'elenco delle mail.

Per inviare a tutti usi la while... e da un punto di vista logico fai la seguenti:

"finchè l'indice è minore del massimo valore dell'array"

{

invia

}

incremento di una unità

giusto?

Ora come ti dicevo prima, il controllo non deve essere solamente sul valore massimo dell'array ma dalla concatenazione di due condizioni: l'indice massimo e l'attesa tra un invio e l'altro.

Ad esempio: supponiamo che come ti dicevo prima che io debba avviare una funzione (inviamail()) ciclicamente e attendendo per un valore di 5.

In c farei così:

int c = 5; //inizializzo la dimensione massima (nel tuo caso è la dim dell'array)

for(c=1;i<=5 && sleep(5000); i++)

{

inviamail();

{

quindi l'incremente di un'unità che a te corrisponde all'invio della mail all'elemento successivo dell'array avviene in corrispondenza della condizione di non superamento della dimensione massima dell'array stesso ma dopo aver atteso 5000ms (5secondi).

Se in asp la sleep non funziona come in c (e questo dovresti dirmelo tu) basta che inizializzi un ulteriore contatore che appunto conti il tempo che vuoi aspettare prima dell'invio di una nuova mail e mettere questo contatore come ulteriore condizione nella for.

spero di essere il più chiaro possibile

Link al commento
Condividi su altri siti

Sei stato abbastanza chiaro, il problema è il seguente che essendo ASP un linguaggio complitao lato server come dire ha problemi con questa funzione, a dirtela tutta non so benissimo cosa c'è che non va....

Però io comunque devo trovare una soluzione, ti praticamente mi consigli di sostirutire al WHILE il FOR come me lo hai scritto tu???

Vogliamo fare una prova, non si sa mai!

Link al commento
Condividi su altri siti

so benissimo che è un linguaggio per il web lato server.... non lo conosco ... perchè il massimo che mi è capitato di fare è l'autenticazione di utenti utilizzando db mysql e php.

Siccome però le istruzioni iterative sono praticamente "standard" in tutti i linguaggi (procedurali, object oriented, web based) se non per qualche piccola variazione a livello di struttura, ma la logica è perfettamente identica..... se questa cosa funziona in c (ed io in passato ho fatto una cosa simile) non vedo perchè non debba funzionare nel linguaggio XXXXXX.

speriamo ti vada bene....

Link al commento
Condividi su altri siti

scusami ma il for lo fai usando una sola condizione?

lo devi fare con due condizioni contemporaneamente

cercando ho trovato come si usa

caso 1)

una sola condizione

Dim i

For i=1 to 10

Response.Write i & "<br>"

Next

Il codice precedente stampa i tenendo conto del solo indice i

dovresti invece usare due for "annidati"

for attesa=1 to 5 // contatore di attesa

for i=1 to 10 //scandaglia gli elementi dell'array

Response.Write i & "<br>"

Next

Next

Link al commento
Condividi su altri siti

ora non sono sicuro della correttezza sintattica del precedente codice

ma di sicuro dei usare due for annidati

mi riporto sempre al c

for (attesa=0;attesa<=5;attesa++){
              for(counter=1;counter<=MAX;counter++){
                                                            inviamail(); 
                                                                         }
                                                              }

Modificato: da frenz10
Link al commento
Condividi su altri siti

l'ultimo estratto di codice che ti ho scritto non da il risultato che vorremmo....

in realtà dovresti cercare di ricreare in asp

la seguente

for(counter=1;counter<=5 && attesa=5; i++)
{
inviamail();   
}
 // la mail viene inviata se l'array non è stato ripercorso fino alla fine e se si è atteso //per un tempo pari a 5

Link al commento
Condividi su altri siti

Carissimo frenz grazie dell'aiuto ma ho risolto con un bel lampo di genio e una funzione di ASP....

Ti posto il codice:

StartTime = Timer()
EndTime = Timer()

WaitTime = EndTime - StartTime

do while WaitTime < 3
EndTime = Timer()
WaitTime = EndTime - StartTime
loop 

Adesso l'invio l'ho settato ogni 3 secondi, che ne dici??? Bella idea??? clap.gif

Link al commento
Condividi su altri siti

Ottimo!

suppongo che poi la variabile WaitTime venga utilizzata come parametro di attesa nel ciclo di invio delle mai no? (for o while che sia)....

in passato una cosa del genere l'ho utilizzata nello sviluppo di un analizzatore di traffico in cui oltre all'analisi dei pacchetti per protocollo andava misurato il tempo di sniffing e lo feci in C con la libreria <time.h> utilizzando una chiamata a time() per lo start ed un'altra per il finishing time e facendo in fine la differenza.....

Link al commento
Condividi su altri siti

Si, non ti ho postato tutto il codice, ma praticamente tutto il corpo dell'invio mail sta prima di questo pezzo, io mando ma prima mail e poi arriva questo controllo, dopodiche setti i secondi (nel mio caso 3) entra nel loop cicla e non appena le condizioni che ho impostato sono vere esce dal while, risale sopra e manda la n-esima mail....

Detto ancora più semplicemente, questa funzionè un loop che è inserito nel loop dell'invio mail....

L'unico problema che dopo avere fatto questa modifica, l'esecuzione diciamo dell'intero ciclo di invio durava (secondi di attesa*numero di mail) quindi nel mio caso 500 mail * 3 sec= circa 1500 secondi.....

Ho scoperto che i server Win IIS hanno di default un massimo di tempo di esecuzione 90 secondi sad.gif quindi non riuscivo a mandare tutte le mail....

Menomale che ho trovato un metodo che si chiama Server.ScriptTimeout = xxxx cun cui puoi settare a tuo piacimento la scadenza della pagina.....

Ora tutto funziona alla meraviglia, però sto ASP del cavolo, sto amministrado un lavoro che non è mio e quindi mi devo adattare......

Spero che con queste poche righe qualcuno che avrà gli stessi miei problemi non perde la notti che ho perso io per trovare le risposte.

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...