Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα σε ολους,

έχω αναλάβει να φτιάξω ένα πρόγραμμα σε ILE C (AS/400) το οποίο δέχεται μηνύματα από την queue, τα περνάει σε ένα άλλο πρόγραμμα και την απάντηση την γράφει πάλι στην queue. Μία από τις λειτουργίες που εκτελεί είναι το timeout των μηνυμάτων (60sec) ώστε να βγάλει διαφορετικό μήνυμα στην queue από την απάντηση.

Μέχρι τώρα χρησιμοποιούσα την Sleep για να μετράω τον χρόνο που περιμένω την απάντηση, αλλα απ'ότι φαίνεται όταν το σύστημα είναι πολύ φορτωμένο μπορεί να περιμένει πάνω από 60sec με τις αλλεπάλληλες sleep με αποτέλεσμα να αργήσει να γράψει στην queue και να κρασάρουν τα υπόλοιπα πρόγραμματα που διαβάζουν την queue για αυτό το μήνυμα.

 

Ο ενναλακτικός τρόπος που θα χρησιμοποιήσω είναι μέσω της time_t ώστε να εκτελεί την Sleep(1) μόνο όταν ο χρόνος από την εκκίνηση μέχρι τώρα είναι μικρότερος του 59.

 

Υπάρχει κάποιος τρόπος να μετρήσω τον χρόνο σε milliseconds ώστε να έχω μεγαλύτερη ακρίβεια και να μην χάσω τυχών μηνύματα που έρχονται ελάχιστα πριν το 60;

 

Ευχαριστώ.

Δημοσ.

Καλησπέρα σε ολους,

έχω αναλάβει να φτιάξω ένα πρόγραμμα σε ILE C (AS/400) το οποίο δέχεται μηνύματα από την queue, τα περνάει σε ένα άλλο πρόγραμμα και την απάντηση την γράφει πάλι στην queue. Μία από τις λειτουργίες που εκτελεί είναι το timeout των μηνυμάτων (60sec) ώστε να βγάλει διαφορετικό μήνυμα στην queue από την απάντηση.

Μέχρι τώρα χρησιμοποιούσα την Sleep για να μετράω τον χρόνο που περιμένω την απάντηση, αλλα απ'ότι φαίνεται όταν το σύστημα είναι πολύ φορτωμένο μπορεί να περιμένει πάνω από 60sec με τις αλλεπάλληλες sleep με αποτέλεσμα να αργήσει να γράψει στην queue και να κρασάρουν τα υπόλοιπα πρόγραμματα που διαβάζουν την queue για αυτό το μήνυμα.

 

Ο ενναλακτικός τρόπος που θα χρησιμοποιήσω είναι μέσω της time_t ώστε να εκτελεί την Sleep(1) μόνο όταν ο χρόνος από την εκκίνηση μέχρι τώρα είναι μικρότερος του 59.

 

Υπάρχει κάποιος τρόπος να μετρήσω τον χρόνο σε milliseconds ώστε να έχω μεγαλύτερη ακρίβεια και να μην χάσω τυχών μηνύματα που έρχονται ελάχιστα πριν το 60;

 

Ευχαριστώ.

Αν μιλάμε υποχρεωτικά για ρουτίνες της C, ρίξε μια ματιά στην clock (& clock_t) καθώς παρέχει πολύ μεγαλύτερη ακρίβεια (σε Windows αυτή ανέρχεται σε millisecond) από την απλή time_t.

 

Υ.Γ.

Παρ’ όλα αυτά θα πρέπει να είσαι προσεκτικός με την χρήση της clock διότι μπορεί να υπάρξουν διαφοροποιήσεις στον τρόπο λειτουργίας της μεταξύ διαφορετικών Λ. Σ. αλλά και μεταφραστών!

 

Προσωπικά θα κοίταζα τις ρουτίνες χρόνου που μου προσφέρει το λειτουργικό του AS/400 (για μεγαλύτερη σιγουριά).

Δημοσ.

Ευχαριστώ για την απάντηση,

θα δοκιμάσω όταν μπορέσω την clock_t σύμφωνα με αυτό το παράδειγμα και το απόσπασμα από το manual.

 

Ευχαριστώ πολύ για την βοήθεια.

 

 

 

clock() — Determine Processor Time

 

Format

#include <time.h>

clock_t clock(void);

Description

Language Level: ANSI

 

The clock() function returns an approximation of the processor time used by the

program since the beginning of an implementation-defined time-period that is

related to the process invocation. To obtain the time in seconds, divide the value

that is returned by clock() by the value of the macro CLOCKS_PER_SEC.

Return Value

 

If the value of the processor time is not available or cannot be represented, the

clock() function returns the value (clock_t)-1.

 

To measure the time spent in a program, call clock() at the start of the program,

and subtract its return value from the value returned by subsequent calls to

clock(). On other platforms, you can not always rely on the clock()function

because calls to the system() function may reset the clock.

 

Example that uses clock()

 

This example prints the time that has elapsed since the program was called.

 

>#include <time.h>
#include <stdio.h>
double time1, timedif;
/* use doubles to show small values */
int main(void)
{
 int i;
 time1 = (double) clock();
 time1 = time1 / CLOCKS_PER_SEC;
 /* get initial time */
 /*
    in seconds
 */
 /* running the FOR loop 10000 times */
 for (i=0; i<10000; i++);
 /* call clock a second time */
 timedif = ( ((double) clock()) / CLOCKS_PER_SEC) - time1;
 printf("The elapsed time is %lf seconds\n", timedif);
}

 

 

Δημοσ.

Σχετικά με το Sleep(ms); στη C#

 

ποτέ δεν κατάλαβα πως γίνεται να έχεις πρώτα ένα μήνυμα και μετά το Delay και να λειτουργεί ανάποδα,

 

>Console.WriteLine("Hello There, now is following a small delay...");
Sleep(2000);

 

πρώτα περιμένεις 2 sec μετά βλέπεις το μήνυμα, QUAK!

Δημοσ.

Σχετικά με το Sleep(ms); στη C#

 

ποτέ δεν κατάλαβα πως γίνεται να έχεις πρώτα ένα μήνυμα και μετά το Delay και να λειτουργεί ανάποδα,

 

>Console.WriteLine("Hello There, now is following a small delay...");
Sleep(2000);

 

πρώτα περιμένεις 2 sec μετά βλέπεις το μήνυμα, QUAK!

 

Το thread σου πέφτει σε sleep πριν προλάβει να εμφανίσει στην κονσόλα το μήνυμα.

Είναι απλά ο τρόπος εκτέλεσης των εντολών (στη σειρά εκτελούνται πάλι απλά δεν προλαβαίνει να το δείξει πριν πέσει σε sleep).

Δημοσ.

Σχετικά με το Sleep(ms); στη C#

 

ποτέ δεν κατάλαβα πως γίνεται να έχεις πρώτα ένα μήνυμα και μετά το Delay και να λειτουργεί ανάποδα,

 

>Console.WriteLine("Hello There, now is following a small delay...");
Sleep(2000);

 

πρώτα περιμένεις 2 sec μετά βλέπεις το μήνυμα, QUAK!

Δεν παιζει κατι τετοιο.

 

 

 

Δημοσ.

Δυστυχώς καμιά φορα γίνεται.

Το έχω πάθει με αλλαγή text σε label λίγο πριν το sleep.

Δεν γινεται. Και να κοιμαται το main παλι η cw θα δουλευει. Πχ

 

>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ConsoleApplication1
{
   class Program
   {
       static void Main(string[] args)
       {
           Console.WriteLine("Haha");
           new Thread(
               () =>
               {
                   for (int i = 0; i < 10; i++)
                   {
                       Console.WriteLine("foo");
                       Thread.Sleep(1000);
                   }

               }
           ).Start();
          
           Thread.Sleep(4000);
       }
   }
}

 

Δημοσ.

Δεν γινεται. Και να κοιμαται το main παλι η cw θα δουλευει. Πχ

 

>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ConsoleApplication1
{
   class Program
   {
       static void Main(string[] args)
       {
           Console.WriteLine("Haha");
           new Thread(
               () =>
               {
                   for (int i = 0; i < 10; i++)
                   {
                       Console.WriteLine("foo");
                       Thread.Sleep(1000);
                   }

               }
           ).Start();
          
           Thread.Sleep(4000);
       }
   }
}

 

 

στο συγκεκριμένο πιο πάνω, με τις 2 γραμμές δουλεύει σωστά, αλλά πολύ συχνά το συναντάω αυτό το πρόβλημα (αν είναι πρόβλημα)

 

δοκίμασε αυτό που σου είπε ο φίλος πάνω, ένα κουμπί και ένα text label, δοκίμασε στο OnClick() να αλλάξεις text και μετά βάλε το delay

 

>private void button1_Click(object sender, EventArgs e)
       {
           label1.Text = "Hello There!";
           System.Threading.Thread.Sleep(5000);
       }

Δημοσ.

στο συγκεκριμένο πιο πάνω, με τις 2 γραμμές δουλεύει σωστά, αλλά πολύ συχνά το συναντάω αυτό το πρόβλημα (αν είναι πρόβλημα)

 

δοκίμασε αυτό που σου είπε ο φίλος πάνω, ένα κουμπί και ένα text label, δοκίμασε στο OnClick() να αλλάξεις text και μετά βάλε το delay

 

>private void button1_Click(object sender, EventArgs e)
       {
           label1.Text = "Hello There!";
           System.Threading.Thread.Sleep(5000);
       }

Στην παραπάνω περίπτωση μπορείς να υποχρεώσεις την εφαρμογή να ανανεώσει αμέσως το περιεχόμενο του "label1" ζητώντας την άμεση επεξεργασία των μηνυμάτων του προγράμματος μέσο της Application.DoEvents() ως εξής:

 

label1.Text = "Hello There!";

Application.DoEvents();

System.Threading.Thread.Sleep(5000);

Με αυτό τον τρόπο το UI Thread θα εφαρμόσει όλα τα μηνύματα που ανήκουν στην παρούσα εφαρμογή και αφού συμβεί αυτό η εκτέλεση θα μεταβεί στο Sleep το οποίο θα παγώσει το (παρόν) UI Thread.

 

Η χρήση της .DoEvents() θέλει προσοχή αλλά υπό συνθήκες μπορεί να φανεί εξαιρετικά χρήσιμη.

 

Επίσης η χρήση της Sleep εντός του UI Thread δεν είναι σοφή επιλογή και καλό είναι να αποφεύγεται (είτε με την χρήση μιας νέας Thread είτε με την χρήση κάποιου Timer -ότι εξυπηρετεί καλύτερα τις ανάγκες της εφαρμογής).

Δημοσ.

στο συγκεκριμένο πιο πάνω, με τις 2 γραμμές δουλεύει σωστά, αλλά πολύ συχνά το συναντάω αυτό το πρόβλημα (αν είναι πρόβλημα)

 

δοκίμασε αυτό που σου είπε ο φίλος πάνω, ένα κουμπί και ένα text label, δοκίμασε στο OnClick() να αλλάξεις text και μετά βάλε το delay

 

>private void button1_Click(object sender, EventArgs e)
       {
           label1.Text = "Hello There!";
           System.Threading.Thread.Sleep(5000);
       }

 

Αυτο με την κονσολα εχει τεραστια διαφορα και οπως λεει ο dx ειναι λαθος τακτικη επειδη κολλας το msg queue με αποτελεσμα να κολλαει ολο το UI. Στο παραπανω το προγραμμα πεταει "not responding" ετσι δεν ειναι; Γενικα το label1.Text = μπλα βαζει ενα msg στο msg queue το οποιο θα εκτελεστει τουλαχιστον οταν το event button1_Click τελειωσει, αρα οπου και να βαλεις το sleep μεσα στην button1_click θα εχεις το ιδιο αποτελεσμα.

 

δλδ και κατι τετοιο να κανεις

>private void button1_Click(object sender, EventArgs e)
       {
           label1.Text = "Hello There!";
           System.Threading.Thread.Sleep(5000);
  label2.Text = "Hello There!";
           System.Threading.Thread.Sleep(5000); 
  label3.Text = "Hello There!";
           System.Threading.Thread.Sleep(5000); 
       }

 

 

Το αποτελεσμα θα ειναι τα labels 1,2,3 να γινουν update σε 15sec!! Και οχι το 1 σε 5 το 2 σε 10 κλπ

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...