Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [C#] Timer e funzioni da eseguire..
Forum - C# / VB.NET - [C#] Timer e funzioni da eseguire..

Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 1:00
Giovedì, 01/01/1970
Salve, dovrei eseguire ogni 5 secondi queste funzioni:

Codice sorgente - presumibilmente C# / VB.NET

  1. private void timer1_Tick(object sender, EventArgs e)
  2.         {
  3.            
  4.             mciSendString("open new Type waveaudio Alias recsound", "", 0, 0);
  5.             mciSendString("record recsound", "", 0, 0);
  6.             mciSendString("save recsound c:\\record.wav", "", 0, 0);
  7.             mciSendString("close recsound ", "", 0, 0);
  8.             timer1.Stop();
  9.             Genera_Spettro("c:\\record.wav");
  10.             mciSendString("play c:\\record.wav", null, 0, 0);
  11.             mciSendString("stop myDevice", null, 0, 0);
  12.            
  13.  
  14.         }


Ma ottengo un errore alla lettura dello spettro... però se registro il wave senza il timer e lo stoppo con un pulsante manualmente e premo il pulsante genera,
lui lo genera normalmente . l'errore che mi da è questo:
System.InvalidOperationException: La sequenza non contiene elementi
Avete idee?.

grazie mille..

PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
1
Down
V
Segnala al moderatore
Postato alle 15:50
Venerdì, 22/10/2010
Quel tipo di eccezione è solitamente associato al tentativo di operare sul risultato di una query linq che restituisce una sequenza vuota. Ma se non ci dici dove è stata lanciata l'eccezione (presumibilmente non si trova nel codice che hai postato), non ti possiamo aiutare.


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
1
Down
V
Segnala al moderatore
Postato alle 11:51
Sabato, 23/10/2010
Codice sorgente - presumibilmente C# / VB.NET

  1. WaveReader wr = new WaveReader(inStream);
  2. this.Wave = wr.Data[0];


Dai tuoi errori, deduco che Data sia vuota. Se Data non contiene elementi, allora alla riga 38 la funzione Average non può restituire dati validi, da cui l'errore Linq (Average è infatti un metodo di estensione introdotto da Linq).
Forse il costruttore di WaveReader utilizza metodi asincroni?

N.B.: l'eccezione in effetti non era nel codice proposto.

Ultima modifica effettuata da Il Totem il 23/10/2010 alle 11:54


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM
Avatar
()
Newbie


Messaggi:
Iscritto:

Up
0
Down
V
Segnala al moderatore
Postato alle 18:04
Venerdì, 22/10/2010
ciao, ti allego il codice completo.....
ma come ripeto con il button registra e stop e poi faccio genera , non mi da nessun errore. invece mettendolo con il timer mi da quell'errore lì:
Codice sorgente - presumibilmente C#

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Drawing.Imaging;
  10. using System.IO;
  11. using System.Runtime.InteropServices;
  12.  
  13. namespace kitt
  14. {
  15.     public partial class kitt : Form
  16.     {
  17.         [DllImport("winmm.dll", EntryPoint = "mciSendStringA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
  18.         private static extern int mciSendString(string lpstrCommand, string lpstrReturnString, int uReturnLength, int hwndCallback);
  19.  
  20.         public bool drag = false;
  21.         public bool enab = false;
  22.         private int opacity = 100;
  23.         private int alpha;
  24.         private Int32[] wave;
  25.         public kitt()
  26.         {
  27.             InitializeComponent();
  28.         }
  29.         public Int32[] Wave
  30.         {
  31.             get
  32.             {
  33.                 return this.wave;
  34.             }
  35.             set
  36.             {
  37.                 this.wave = value;
  38.                 this.WaveAverage = (int)Math.Round(wave.Average());
  39.                 if (this.Parent != null) Parent.Invalidate(this.Bounds, true);
  40.             }
  41.         }
  42.  
  43.        
  44.         public int WaveAverage { get; private set; }
  45.  
  46.  
  47.         private void GenerateSampleWave()
  48.         {
  49.             Random r = new Random();
  50.             wave = new Int32[400];
  51.             for (int i = 0; i < wave.Length; i++)
  52.             {
  53.                 wave[i] = r.Next();
  54.             }
  55.             this.WaveAverage = (int)Math.Round(wave.Average());
  56.         }
  57.         private void button1_Click(object sender, EventArgs e)
  58.         {/*
  59.             OpenFileDialog openFileDialog1 = new OpenFileDialog();
  60.             openFileDialog1.InitialDirectory = "c:\\";
  61.             openFileDialog1.Filter = "wave files (*.wave)|*.wave|All files (*.*)|*.*";
  62.             openFileDialog1.FilterIndex = 2;
  63.             openFileDialog1.RestoreDirectory = false;
  64.             if (openFileDialog1.ShowDialog() == DialogResult.OK)
  65.             {
  66.  
  67.             }
  68.           */
  69.             Genera_Spettro("c:\\record.wav");
  70.             mciSendString("play c:\\record.wav", null, 0, 0);
  71.             mciSendString("stop myDevice", null, 0, 0);
  72.  
  73.            }
  74.         private void Genera_Spettro(string filename)
  75.         {
  76.  
  77.             FileStream inStream = File.OpenRead(filename);
  78.             WaveReader wr = new WaveReader(inStream);
  79.             this.Wave = wr.Data[0];
  80.  
  81.             if (this.wave == null)
  82.             {
  83.                 this.GenerateSampleWave();
  84.             }
  85.             if (this.wave.Length > 0)
  86.             {
  87.                 Bitmap bmp = new Bitmap(pictureBox1.Width - 1, pictureBox1.Height - 1);
  88.                 Graphics g = Graphics.FromImage(bmp);
  89.                 Rectangle bounds = new Rectangle(0, 0, this.Width - 1, this.Height - 1);
  90.  
  91.                 Color frmColor = this.BackColor;
  92.                 Brush bckColor;
  93.  
  94.                 alpha = (opacity * 255) / 100;
  95.  
  96.                 if (drag)
  97.                 {
  98.                     Color dragBckColor;
  99.  
  100.                     if (BackColor != Color.Transparent)
  101.                     {
  102.                         int Rb = BackColor.R * alpha / 255 + frmColor.R * (255 - alpha) / 255;
  103.                         int Gb = BackColor.G * alpha / 255 + frmColor.G * (255 - alpha) / 255;
  104.                         int Bb = BackColor.B * alpha / 255 + frmColor.B * (255 - alpha) / 255;
  105.                         dragBckColor = Color.FromArgb(Rb, Gb, Bb);
  106.                     }
  107.                     else dragBckColor = frmColor;
  108.  
  109.                     alpha = 255;
  110.                     bckColor = new SolidBrush(Color.FromArgb(alpha, dragBckColor));
  111.                 }
  112.                 else
  113.                 {
  114.                     bckColor = new SolidBrush(Color.FromArgb(alpha, this.BackColor));
  115.                 }
  116.  
  117.                 Pen pen = new Pen(this.ForeColor);
  118.  
  119.                 if (this.BackColor != Color.Transparent | drag)
  120.                 {
  121.                     g.FillRectangle(bckColor, bounds);
  122.                 }
  123.  
  124.                 int middle = bounds.Top + (int)Math.Round((double)bounds.Height / 2d);
  125.                 double factor = Math.Floor(((double)bounds.Height) / 2d) / ((double)this.wave.Max(i => Math.Abs(i - WaveAverage)));
  126.                 double dataPerPixel = ((double)this.wave.Length) / ((double)(bounds.Width + 1));
  127.                 int length = (int)Math.Ceiling(dataPerPixel);
  128.                 int posA = 0;
  129.                 if (length == 1)
  130.                 {
  131.                     int yA = middle + (int)Math.Round((double)(this.wave[0] - WaveAverage) * factor);
  132.                     int yB = yA;
  133.                     for (int x = bounds.Left + 1; x <= bounds.Right; x++)
  134.                     {
  135.                         int posB = (int)Math.Floor(((double)(x - bounds.Left)) * dataPerPixel);
  136.                         if (posB > posA)
  137.                         {
  138.                             posA = posB;
  139.                             yB = middle + (int)Math.Round((double)(this.wave[posB] - WaveAverage) * factor);
  140.                         }
  141.                         g.DrawLine(pen, new Point(x - 1, yA), new Point(x, yB));
  142.                         yA = yB;
  143.                     }
  144.                 }
  145.                 else
  146.                 {
  147.                     int yA = middle + (int)Math.Round((double)(this.wave[0] - WaveAverage) * factor);
  148.                     int yB = yA;
  149.                     for (int x = bounds.Left + 1; x <= bounds.Right; x++)
  150.                     {
  151.                         int posB = (int)Math.Floor(((double)(x - bounds.Left)) * dataPerPixel);
  152.                         yB = middle + (int)Math.Round((double)(this.wave[posB] - WaveAverage) * factor);
  153.                         if ((posB - posA) > 1)
  154.                         {
  155.                             Int32[] values = new Int32[posB - posA];
  156.                             Array.Copy(wave, posA + 1, values, 0, posB - posA);
  157.                             int max = (int)Math.Round((double)(values.Max() - WaveAverage) * factor);
  158.                             int min = (int)Math.Round((double)(values.Min() - WaveAverage) * factor);
  159.                             if (max == min)
  160.                                 g.DrawLine(pen, new Point(x - 1, yA), new Point(x, middle + max));
  161.                             else
  162.                                 g.DrawLine(pen, new Point(x, middle + min), new Point(x, middle + max));
  163.                         }
  164.                         else
  165.                         {
  166.                             g.DrawLine(pen, new Point(x - 1, yA), new Point(x, yB));
  167.                         }
  168.                         posA = posB;
  169.                         yA = yB;
  170.                     }
  171.                 }
  172.                 pictureBox1.Image = bmp;
  173.                 pen.Dispose();
  174.                 bckColor.Dispose();
  175.                 g.Dispose();
  176.             }
  177.         }
  178.         private void btnSalva_Click(object sender, EventArgs e)
  179.         {
  180.             pictureBox1.Image.Save("d:\\provawave.png", ImageFormat.Png);
  181.         }
  182.  
  183.         private void btnRegistra_Click(object sender, EventArgs e)
  184.         {
  185.             // record from microphone
  186.             mciSendString("open new Type waveaudio Alias recsound", "", 0, 0);
  187.             mciSendString("record recsound", "", 0, 0);
  188.         }
  189.  
  190.         private void btnRegistraStop_Click(object sender, EventArgs e)
  191.         {
  192.             // stop and save
  193.             mciSendString("save recsound c:\\record.wav", "", 0, 0);
  194.             mciSendString("close recsound ", "", 0, 0);
  195.         }
  196.  
  197.         private void timer1_Tick(object sender, EventArgs e)
  198.         {
  199.            
  200.             mciSendString("open new Type waveaudio Alias recsound", "", 0, 0);
  201.             mciSendString("record recsound", "", 0, 0);
  202.             mciSendString("save recsound c:\\record.wav", "", 0, 0);
  203.             mciSendString("close recsound ", "", 0, 0);
  204.             timer1.Stop();
  205.             Genera_Spettro("c:\\record.wav");
  206.             mciSendString("play c:\\record.wav", null, 0, 0);
  207.             mciSendString("stop myDevice", null, 0, 0);
  208.            
  209.  
  210.         }
  211.         private void kitt_Load(object sender, EventArgs e)
  212.         {
  213.             // Sets the timer interval to 5 seconds.
  214.             timer1.Interval = 5000;
  215.             timer1.Start();
  216.  
  217.  
  218.         }
  219.  
  220.        
  221.     }
  222. }


ecco l'errore completo:
************** Testo dell'eccezione **************
System.InvalidOperationException: La sequenza non contiene elementi
   in System.Linq.Enumerable.Average(IEnumerable`1 source)
   in kitt.kitt.set_Wave(Int32[] value) in D:\pc-desktop\luigi\Desktop\kitt\kitt\kitt.cs:riga 38
   in kitt.kitt.Genera_Spettro(String filename) in D:\pc-desktop\luigi\Desktop\kitt\kitt\kitt.cs:riga 79
   in kitt.kitt.timer1_Tick(Object sender, EventArgs e) in D:\pc-desktop\luigi\Desktop\kitt\kitt\kitt.cs:riga 205
   in System.Windows.Forms.Timer.OnTick(EventArgs e)
   in System.Windows.Forms.Timer.TimerNativeWindow.WndProc(Message& m)
   in System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Manca una classe perchè non posso metterla nel forum.. per proprietà mia.

Mi dici come risolvo?
Grazie.

PM
Avatar
()
Newbie


Messaggi:
Iscritto:

Up
0
Down
V
Segnala al moderatore
Postato alle 18:47
Sabato, 23/10/2010
Testo quotato

Postato originariamente da Il Totem:

Codice sorgente - presumibilmente C# / VB.NET

  1. WaveReader wr = new WaveReader(inStream);
  2. this.Wave = wr.Data[0];


Dai tuoi errori, deduco che Data sia vuota. Se Data non contiene elementi, allora alla riga 38 la funzione Average non può restituire dati validi, da cui l'errore Linq (Average è infatti un metodo di estensione introdotto da Linq).
Forse il costruttore di WaveReader utilizza metodi asincroni?

N.B.: l'eccezione in effetti non era nel codice proposto.



si è quello l'errore perchè il file registrato a 00:00:00 e non può fare lo spettro.
ora vedo come fare.. e poi ti faccio sapere.
grazie.

PM
Usa i commenti per chiedere spiegazioni o ringraziare le risposte.