Nano Hash - криптовалюты, майнинг, программирование

С++ PictureBox gifs в Windows Form, анимация почти на половинной скорости?

Позвольте мне предварить этот вопрос, заявив, что я студент, который в настоящее время изучает C++, и я почти ничего не знаю о Visual Studio. До этого момента мы использовали Borland C++ Builder 2010, но я переключился на Visual Studio 2015 для нашего последнего мини-проекта для этой статьи.
Поскольку это статья на C++, я должен кодировать на С++, а не на С# или что-то еще, что было бы намного лучше. Что еще более важно, многие проблемы, которые я искал в Google, привели к решениям C#!
Я гораздо более уверен в Java, а C++ до сих пор был проблемой.

Впрочем, на вопрос:

Я только что просмотрел краткое руководство о том, как создать быстрое приложение с пользовательским интерфейсом в Visual Studio, в котором есть генератор чисел[ссылка]. Однако я заметил, что если я заменю файл изображения в графическом окне на файл .gif, он загрузится и отобразится и все такое, но будет анимироваться примерно вдвое медленнее при запуске программы. Мой код (в основном) идентичен коду, приведенному в приведенной выше ссылке, просто я использовал собственное изображение для изображения.

Когда я приступлю к созданию собственного приложения для своего проекта, я планировал включить много анимированных изображений, чтобы они не воспроизводились так медленно. Является ли это проблемой, присущей графическим окнам, и можно ли ее исправить?
Я просматривал код как в form.h, так и в form.cpp, но не вижу ни скрытия, ни волос ни функции update(), ни чего-либо связанного к таймерам. Я также видел кое-что о классе ImageAnimator, который, по-видимому, выполняет анимацию кадр за кадром, и я мог бы изучить, будет ли он работать лучше, чем ящик для изображений, но ящики для изображений очень просты для меня.

Код MyForm.h (в основном созданный в представлении «Дизайн»):

#pragma once
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

namespace RNG {

    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;

    /// <summary>
    /// Summary for MyForm
    /// </summary>
    public ref class MyForm : public System::Windows::Forms::Form
    {
    public:
        MyForm(void)
        {
            InitializeComponent();
            //
            //TODO: Add the constructor code here
            //
        }

    protected:
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        ~MyForm()
        {
            if (components)
            {
                delete components;
            }
        }
    private: System::Windows::Forms::Label^  label1;
    protected:
    private: System::Windows::Forms::Label^  label2;
    private: System::Windows::Forms::Label^  label3;
    private: System::Windows::Forms::Label^  label4;
    private: System::Windows::Forms::Label^  label5;
    private: System::Windows::Forms::Label^  label6;
    private: System::Windows::Forms::Label^  label7;
    private: System::Windows::Forms::Button^  button1;
    private: System::Windows::Forms::Button^  button2;
    private: System::Windows::Forms::PictureBox^  pictureBox1;

    private:
        /// <summary>
        /// Required designer variable.
        /// </summary>
        System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        void InitializeComponent(void)
        {
            System::ComponentModel::ComponentResourceManager^  resources = (gcnew System::ComponentModel::ComponentResourceManager(MyForm::typeid));
            this->label1 = (gcnew System::Windows::Forms::Label());
            this->label2 = (gcnew System::Windows::Forms::Label());
            this->label3 = (gcnew System::Windows::Forms::Label());
            this->label4 = (gcnew System::Windows::Forms::Label());
            this->label5 = (gcnew System::Windows::Forms::Label());
            this->label6 = (gcnew System::Windows::Forms::Label());
            this->label7 = (gcnew System::Windows::Forms::Label());
            this->button1 = (gcnew System::Windows::Forms::Button());
            this->button2 = (gcnew System::Windows::Forms::Button());
            this->pictureBox1 = (gcnew System::Windows::Forms::PictureBox());
            (cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox1))->BeginInit();
            this->SuspendLayout();
            // 


            //[code for 7 labels and 2 buttons, not important to question] 


            // pictureBox1
            // 
            this->pictureBox1->Image = (cli::safe_cast<System::Drawing::Image^>(resources->GetObject(L"pictureBox1.Image")));
            this->pictureBox1->Location = System::Drawing::Point(1, -2);
            this->pictureBox1->Name = L"pictureBox1";
            this->pictureBox1->Size = System::Drawing::Size(132, 104);
            this->pictureBox1->TabIndex = 9;
            this->pictureBox1->TabStop = false;
            // 
            // MyForm
            // 
            this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
            this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
            this->ClientSize = System::Drawing::Size(502, 86);
            this->Controls->Add(this->pictureBox1);
            this->Controls->Add(this->button2);
            this->Controls->Add(this->button1);
            this->Controls->Add(this->label7);
            this->Controls->Add(this->label6);
            this->Controls->Add(this->label5);
            this->Controls->Add(this->label4);
            this->Controls->Add(this->label3);
            this->Controls->Add(this->label2);
            this->Controls->Add(this->label1);
            this->Name = L"MyForm";
            this->Text = L"MyForm";
            this->Load += gcnew System::EventHandler(this, &MyForm::MyForm_Load);
            (cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox1))->EndInit();
            this->ResumeLayout(false);
            this->PerformLayout();

        }
#pragma endregion
    private: System::Void MyForm_Load(System::Object^  sender, System::EventArgs^  e) {
    }
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
        int num[7] = { 0 };

        // seed
        srand((int)time(0));

        // Randomize the array values.
        for (int i = 0; i < 7; i++)
            num[i] = (rand() % 99) + 1;

        // set the label text with random number
        this->label1->Text = Convert::ToString(num[0]);
        this->label2->Text = Convert::ToString(num[1]);
        this->label3->Text = Convert::ToString(num[2]);
        this->label4->Text = Convert::ToString(num[3]);
        this->label5->Text = Convert::ToString(num[4]);
        this->label6->Text = Convert::ToString(num[5]);
        this->label7->Text = Convert::ToString(num[6]);

        // change the button states.
        //this->button1->Enabled = false;
        this->button2->Enabled = true;
    }
    private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
        // clear label fields
        this->label1->Text = "0";
        this->label2->Text = "0";
        this->label3->Text = "0";
        this->label4->Text = "0";
        this->label5->Text = "0";
        this->label6->Text = "0";
        this->label7->Text = "0";

        // set button state
        this->button1->Enabled = true;
        this->button2->Enabled = false;
    }
    };
}

И MyForm.cpp:

#include "MyForm.h"

using namespace System;
using namespace System::Windows::Forms;


[STAThread]
void Main(array<String^>^ args)
{
    Application::EnableVisualStyles();
    Application::SetCompatibleTextRenderingDefault(false);

    RNG::MyForm form;
    Application::Run(%form);
}

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


  • Если ваша статья должна быть посвящена C++, то это вряд ли обрадует вашего преподавателя. Это не С++. Вы должны вызвать timeBeginPeriod(10), чтобы получить точную скорость воспроизведения для GIF. 25.09.2015
  • Проект требует графического интерфейса некоторого описания в дополнение к тому коду, который мы пишем на C++. Спасибо за помощь, хотя - не понимал, что на самом деле это не С++. 26.09.2015

Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..