C# threading

  • Autore discussione Autore discussione sebax
  • Data d'inizio Data d'inizio
Pubblicità

sebax

Utente Attivo
Messaggi
1,475
Reazioni
406
Punteggio
71
ciao a tutti, vorrei creare un thread secondario che esegua un ciclo molto impegnantivo (estrazione di numeri primi per esempio) senza che si blocchi l'interfaccia grafica. faccio una struct Estrai() con le istruzioni per l'estrazione nella classe Form1, nel metodo del click del bottone di avvio scrivo:


Thread th = new Thread(Estrai);
th.Start();
textBox2.Text = ris;

(ris è una variabile globale string col risultato) ma quando avvio il programma al clic sul bottone non succede niente... idee?
 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace estr_primi
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

string ris = "";
int maxN, N = 0, ini;

private void button1_Click(object sender, EventArgs e)
{

int temp = Environment.TickCount;
try
{
maxN = Convert.ToInt32(textBox1.Text);
ini = Convert.ToInt32(TextBox3.Text);
}
catch (System.FormatException)
{
textBox2.Text = "Inserire un numero valido";
return;
}

Thread th = new Thread(Estrai);
th.Start();
textBox2.Text = ris;
toolStripStatusLabel1.Text = "Fino a " + textBox1.Text + " ci sono " + N +
" numeri primi. In " + (Environment.TickCount - temp) + " ms.";
N = 0;

}

void Estrai()
{
ris = "";
long i, p;
bool h = false;
for (p = ini; p <= maxN; p++)
{
h = false;
if ((p % 2 != 0 || p == 2) && (p % 3 != 0 || p == 3))
{
for (i = 3; i < p; i++)
{
if (p % i == 0)
{
h = true;
break;
}
}
if (h == false || p == 2 || p == 3)
{
ris += p + "\t";
N++;
}
}
}
}
}
}
 
Tratto da wikipedia
C# [modifica]

Questo metodo scritto in linguaggio C# consente la stampa in output tutti i numeri primi inferiori al parametro "limite".
Si basa su un ciclo che scorre tutti i numeri inferiori al parametro e valuta tramite un secondo metodo di nome "primo" se ogni singolo numero è primo o meno.
using System;

namespace Numeri_Primi
{
class Program
{
static void Main(string[] args)
{
int limite;
Console.WriteLine("Scrivi Limite:");
limite = Convert.ToInt32(Console.ReadLine());
if (limite > 1)
{
int pos = 2;
while (pos <= limite)
{
if (primo(pos)) Console.WriteLine(pos);
pos++;
}
}
Console.Read();
}

static protected bool primo(int numero)
{
int pos = (numero + 1) / 2;
while (pos > 1)
{
if (numero % pos == 0 && pos != numero && pos != 1) return false;
pos--;
}
return true;
}
}
}
 
Pubblicità
Pubblicità
Indietro
Top