панель процесса во всплывающем окне - PullRequest
0 голосов
/ 29 августа 2018

хорошо, я делаю панель процессов, и это работает. теперь, у меня есть это во всплывающем окне, и я хочу, чтобы это обновлялось, пока какое-то слово делается в другом потоке (не основном потоке). В любом случае, я пытаюсь обновить процесс, используя информацию из этого другого потока, но он не обновляется. Я использую цикл for в другом потоке, и я использую, поэтому я нахожу, какой процент мне осталось пойти. здесь, в моем коде:

void callPopUp()
    {
        new Thread(() => new PopUp().ShowDialog()).Start();

    }
   //___ other thread 
    bool running(int Baseline)
    {

        HomeMO();

        tcClient.WriteAny(statenumber, Int16.Parse("11"));
        while ( state != 11)
        {
            Thread.Sleep(500);
            tcClient.WriteAny(statenumber, Int16.Parse("11"));
        }
        StepInfo step= get_StepInfo();
        int point = step.Start_Step;
        callPopUp();

        stepPass = step.degress;
        startStep = step.Start_Step;
        stopStep = step.End_Step;
        for ( int i =0; i < step.runcount; i++)
        {
            try
            {

                callPopUp(i, step);
              ...

теперь это в моей основной форме. вот код в моей всплывающей форме:

  private void t_Tick(object sender, EventArgs e)
    {
        // graphics 
        g = Graphics.FromImage(bmp);
        // clear grapthic
        g.Clear(Color.LightBlue);
        //draw progressbar
        g.FillRectangle(Brushes.CornflowerBlue, new Rectangle(0, 0,(int)(percent * pbUNit), (int)pbHEIGHT));
        // draw % complete
        g.DrawString(percent + " %", new Font("Arial", (pbHEIGHT / 2F)), Brushes.Black, new PointF((pbWIDTH/2F)-20, (pbHEIGHT/2F)-20));

        //load bitmap in picturebox
        pictureBox1.Image = bmp;


        if(percent > 100)
        {
            // dispose
            g.Dispose();
            t.Stop();
        }
    }
}

это таймер, который рисует панель процесса. но как-то проц не обновляется. вот вся форма:

 public partial class PopUp : Form
{
    Timer t = new Timer();
    double pbUNit;
    float pbWIDTH, pbHEIGHT, pbComplete;
    Bitmap bmp;
    Graphics g;
    private int percent =0;
    public string Title;

    public int Percents
    {
        get { return percent; }
        set { percent = value; }
    }
    public PopUp()
    {
        InitializeComponent();
        this.Text = Title;
    }

    private void PopUp_Load(object sender, EventArgs e)
    {

        this.Text = Title;
        pbWIDTH = pictureBox1.Width;
        pbHEIGHT = pictureBox1.Height;
        pbUNit = pbWIDTH / 100.0;
        // pbComplete - this is equal to work completed in % [min = 0 max= 100]
        pbComplete = 0;

        bmp = new Bitmap((int)pbWIDTH, (int)pbHEIGHT);

        //timer
        t.Interval = 50;
        t.Tick += new EventHandler(this.t_Tick);
        t.Start();}

опять же, это хорошо работает, если я просто вставляю счетчик во всплывающей форме. но это не работает, когда я отправляю данные во всплывающее окно. он просто остается на 0;

также я попробовал .show, но всплывающая форма появляется, но я вообще не вижу свою панель процессов.

1 Ответ

0 голосов
/ 30 августа 2018

Вы не можете отобразить всплывающее диалоговое окно из другого потока, вы можете получить доступ только к элементам пользовательского интерфейса в потоке пользовательского интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...