Jump to content
PLC Forum

einsteinmc2

Funzione Sleep In Asp

Recommended Posts

einsteinmc2

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 to post
Share on other sites

frenz10

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 to post
Share on other sites
frenz10

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 to post
Share on other sites
einsteinmc2

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

Edited by einsteinmc2
Link to post
Share on other sites
frenz10

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 to post
Share on other sites
frenz10

e scusami se ho scritto grammaticalmente male ma nella foga capita... poi rileggendo ci si mette le mani nei capelli tongue.gif

Link to post
Share on other sites
einsteinmc2

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 to post
Share on other sites
frenz10

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 to post
Share on other sites
einsteinmc2

senzasperanza.gif niente da fare, l'ho esplicitato sotto forma di FOR in ASP

FOR contatore = inizio TO fine

'eseguo il codice

NEXT

ma niente non va, non funge!

Link to post
Share on other sites
frenz10

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 to post
Share on other sites
frenz10

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(); 
                                                                         }
                                                              }

Edited by frenz10
Link to post
Share on other sites
frenz10

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 to post
Share on other sites
einsteinmc2

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 to post
Share on other sites
frenz10

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 to post
Share on other sites
einsteinmc2

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 to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...