Login · Register
08.09.2010 00:11:22
Aktualnie online
· Gości online: 3

· Użytkowników online: 0

· Łącznie użytkowników: 52
· Najnowszy użytkownik: snake


Reklama
www.ddt.pl

www.maddevblog.eu

Statystyki reklamowe

Statystyki

Monitorowanie:



W sieci od:
24 czerwca 2009


Logowanie
Nazwa użytkownika

Hasło



Nie masz jeszcze konta?
Zarejestruj się

Nie możesz się zalogować?
Poproś o nowe hasło

Ostatnie artykuły

Ostatnio Widziani
· djszalas02:16:52
· kabanek03:55:48
· DamianLii08:15:26
· pipczaqu 5 dni
· janisz 6 dni
· radzioon 6 dni
· snake 6 dni
· damn 6 dni
· iluvathar 6 dni
· adam2006 1 tydzień

Zobacz temat
DevQt.pl - Programowanie C++ / Qt :: PROGRAMOWANIE - C++ i Qt :: Szukam Pomocy
Kto jeszcze czyta ten temat? 1 gość(ci)
 Drukuj temat
Okienka aplikacji "lagują" podczas wykonywania pętli.
wojtek1990
#1 Drukuj posta
Dodany dnia 22.07.2010 16:42:04
Początkujący Użytkownik


Postów: 13
Data rejestracji: 20.07.10

Witam.

Probuje stworzyć prostą aplikacje (bot do gry) w QT. Pierwsza "poważniejsza" funkcja działa, ale okienka aplikacji lagują po jej wywołaniu (zresztą dzieje sie tak kiedy wywołam jakąkolwiek pętle).

Stworzylem główne okno, ktore wywoluje okienko Tasker w ten sposob:

Pobierz kod źródłowy  Kod źródłowy

void MainWindow::on_actionTasker_activated()
{

    AddressBook *tasker = new AddressBook();
    tasker->show();
}





Tak wyglada to okienko przed uruchomieniem funkcji tasker'a:
img687.imageshack.us/img687/9831/68426518.png

A tak przy jego dzialaniu (aplikacja dziala ale okienko sie zwiesza, a wolalbym jednak móc zatrzymac ją checkbox'em z okienka Tasker'a):

img101.imageshack.us/img101/1373/47199874.png

Do tej pory progamowalem wylacznie strukturalnie bardzo proste aplikacje, poczytalem troche o programowaniu obiektowym i postanowailem sie troche w to "pobawic". Nie mam jeszcze wystarczajacej wiedzy w jaki sposob jedna aplikacja moze wykonywac wiele pętli jednoczesnie. Czy trzeba uworzyc jakis nowy proces aby bylo to mozliwe ? Prosilbym o doedukowanie mnie - jesli ktos ma link do jakiegos porzadnego tutoriala, z ktorym mi sie zapoznać przed tworzeniem takiej aplikacji proszę o linka.

Ps. Po zamknieciu okienka (ctrl + alt + delete) w Komunikatach aplikacji pojawia sie:

Pobierz kod źródłowy  Kod źródłowy

C:\Users\Wojtek\Desktop\bot_gui\bot-build-desktop\release\bot.exe zakończone kodem -805306369





Zalaczam kod Tasker'a ... mam nadzieje, ze nie bedziecie do mnie strzelac, iz zabieram sie do czegos nie posiadajac wystarczajacej wiedzy.


addressbook.h
Pobierz kod źródłowy  Kod źródłowy


#ifndef ADDRESSBOOK_H
#define ADDRESSBOOK_H

#include <QWidget>
#include <QMap>
#include <QMessageBox>
#include <QString>

namespace Ui {
    class AddressBook;
}

class AddressBook : public QWidget
{
    Q_OBJECT

public:
    explicit AddressBook(QWidget *parent = 0);
    ~AddressBook();

private:
    Ui::AddressBook *ui;

public slots:

    void submitContact();
    int checkBox();
    //void podzial_liter ();
    int wielka_litera(char);
    void wiadomosc(char *wsk, int dl);
    void tasker();
    //void wiadomosc();

};

#endif // ADDRESSBOOK_H





addressbook.cpp
Pobierz kod źródłowy  Kod źródłowy


#include "addressbook.h"
#include "ui_addressbook.h"
#include "mainwindow.h"
#include "mainwindow.cpp"
#include <stdio.h>
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <string.h>
#include <QtGui>
#include <QString>
#include <QStringList>


static const int EXPERIENCE = 0x49A00C;
static const int LEVEL = 0x49A008;
static const int MANA = 0x499FF8;
static const int HP = 0x49A014;

using namespace std;

    int oldName;
    QString oldAddress;

AddressBook::AddressBook(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::AddressBook)
{
    ui->setupUi(this);
    Qt::WindowFlags flags;
    flags = Qt::Window | Qt::WindowMinimizeButtonHint;
    setWindowFlags( flags );
    connect(ui->OK, SIGNAL(clicked()), this,SLOT(submitContact()));
    connect(ui->checkBox, SIGNAL(clicked()), this,SLOT(checkBox()));

}

AddressBook::~AddressBook()
{
    delete ui;
}

int AddressBook::wielka_litera (char znak) {
    if ((int(znak) >= 33 && int(znak) <=43) || (int(znak) >= 58 && int(znak) <= 90)) return 1;
    else return 0;
}

void AddressBook::wiadomosc (char *wsk, int dl)
{

char znak;

        for(int i = 0; i < dl; i++)
            {
                znak=wsk[i];

                Sleep(100);

     if (wielka_litera(znak)) keybd_event(VK_SHIFT, 0, 0, 0);


                keybd_event(VkKeyScan(znak), 0, 0, 0);
                keybd_event(VkKeyScan(znak), 0, KEYEVENTF_KEYUP, 0);

     if (wielka_litera(znak)) keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);

        }
        keybd_event(VK_RETURN, 0, 0, 0);
        keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0);
}

void AddressBook::tasker () {

    std::string message = oldAddress.toStdString();
    //string message=std::string((const char*)oldAddress);
    //string message = oldAdress;

    for (int i=0;i<=oldName;i=i+6) {
        Sleep(60);
    }

    int dlugosc = message.length();
    char *message_char = new char[dlugosc+1];
    strcpy(message_char, message.c_str());

    wiadomosc (message_char,dlugosc);
}


int AddressBook::checkBox() {
Qt::CheckState state;

state = (ui->checkBox)->checkState();
if ( state == Qt::Checked ) return 1;
else return 0;
}

void AddressBook::submitContact()
{
    oldName = ui->time->value();
    oldAddress = ui->message->text();
    while (checkBox()==1) tasker();
}





Prosze o pomoc :)
Edytowane przez wojtek1990 dnia 22.07.2010 17:02:51
 
janisz
#2 Drukuj posta
Dodany dnia 23.07.2010 13:48:29
Awatar

Użytkownik


Postów: 51
Data rejestracji: 22.03.10

Musisz zrobić to w oddzielnym wątku, inaczej zawsze GUI będzie Ci wisieć przy dłużej trwających zadaniach.
 
wojtek1990
#3 Drukuj posta
Dodany dnia 23.07.2010 15:31:55
Początkujący Użytkownik


Postów: 13
Data rejestracji: 20.07.10

janisz napisał/a:
Musisz zrobić to w oddzielnym wątku, inaczej zawsze GUI będzie Ci wisieć przy dłużej trwających zadaniach.


Własnie tego sie spodziewalem, czy moglbys mi dac przyklad w jaki sposob utworzyc/zamknac/operowac na nowym wątku ?

edit: Rozwiązane przy pomocy klasy QThread.
Dzieki za pomoc.
Edytowane przez wojtek1990 dnia 23.07.2010 21:42:49
 
kof
#4 Drukuj posta
Dodany dnia 26.07.2010 16:45:53
Awatar

Początkujący Użytkownik


Postów: 37
Data rejestracji: 04.07.10

To zadanie samo w sobie nie wymagało stosowania wątków. Problem autora polega na tym, że zastosował funkcje sleep w wyniku czego program sprawiał wrażenie przeciążonego obliczeniowo. Aplikacja zamiast pętli z udziałem sleep powinna korzystać z konstrukcji slotów na przykładzie QTimer.
Tylko programy tworzą programistów.
 
http://dev-kof.blogspot.com/
wojtek1990
#5 Drukuj posta
Dodany dnia 26.07.2010 19:38:38
Początkujący Użytkownik


Postów: 13
Data rejestracji: 20.07.10

Dobrze wiedziec, dzieki za informacje Smile
 
Przeskocz do forum:
Podobne Tematy
Temat Forum Odpowiedzi Ostatni post
Zmiana przyciskow głownego pasku aplikacji. Szukam Pomocy 3 11.08.2010 00:11:11
QSslSocket - dystrybucja aplikacji Szukam Pomocy 5 18.07.2010 18:56:12
Ikonka Aplikacji Szukam Pomocy 7 23.01.2010 11:52:01