Jump to content

Variáveis Locais e globais


BlitzMX
 Share

Recommended Posts

Boa tarde

Agradeço um esclarecimento se alguém poder ajudar.

Tenho uma aplicação que tenho vindo a desenvolver e que lê a páginas de finanças do Google para lhe extrair informações sobre as empresas cotadas na bolsa.

O meu código consiste no seguinte.

FrmLoad - Com a interface e o botão de start.

btnStart - Com o código que lança  threads independentes para cada mercado (NASDAQ, NYSE, NYSEAMEX, TSE e PINK)

Dentro das Threads tenho o código "TRY e Catch" para no caso de error poder contar e codificar outras decisões e coisas a fazer se der erro na leitura da página ou assim.

A minha duvida é a seguinte... O código de cada página é guardado para uma variável de nome "sourcecode" e este nome é igual em todas as threads e funções.

Funções tais como a de eliminação de caracteres especiais que causam erros e leitura do código para encontrar os dados a extrair.

A função de extração de dados é igual para todos os mercados, mas como o ciclo das threads é independente será que causa erro por usar sempre a mesma função???

Será possível a mesma função dar erro porque está a ser chamada enquanto está a ser usada por outra thread?

O programa  já funcionou bem mas agora com uma ProgressBar e contagens de totais. dá erro sem mais nem menos e breaka.

Devo criar uma função para cada thread?

É possível recriar a mesma função igual para todos e não usar sempre a mesma ou repetir o código 5 vezes para cada thread e mudar o nome das variáveis?

Obrigado

Cumps

Link to comment
Share on other sites

O facto de teres mais que um Thread a usar a mesma função não afecta nada, excepto quando ambos os threads vão mexer em algo comum a ambos, por exemplo uma variável que esteja declarada fora da função, um controlo num formulário, etc.

Pedro Martins

Não respondo a duvidas por PM

Link to comment
Share on other sites

O que é que alteras ai?

como assim o que altero aí?

Cada thread chama a mesma função, envia-lhe a variável... a função aceita a varável e trabalha em cima para depois lista tudo numa lstBox.

Existem 3 Funções que recebem a chamada de 5 threads.

Será que dá erro quando as 5 chamam ao mesmo tempo?

Link to comment
Share on other sites

como assim o que altero aí?

Cada thread chama a mesma função, envia-lhe a variável... a função aceita a varável e trabalha em cima para depois lista tudo numa lstBox.

Existem 3 Funções que recebem a chamada de 5 threads.

Será que dá erro quando as 5 chamam ao mesmo tempo?

Ou será de as 5 threads tentarem escrever ao mesmo tempo na lstBox através das funções?

Obrigado

Link to comment
Share on other sites

Sim as 5 threads enviam ao mesmo tempo o sourcecode de cada página ao mesmo tempo para as funções.

São 3 funções, cada uma extrai determinados valores do código e adiciona tudo por ordem numa lstBox.

Será que o erro ocorre quando, ao mesmo tempo, elas tentam escrever na lstBox?

Link to comment
Share on other sites

Talvez seja melhor utilizar uma fila(Queue), ou seja, tens lá os teus cinco threads a correr em simultâneo que vão encadear informações nessa fila, depois tens um outro thread que vai processar essa informação a medida que vai entrando.

Pedro Martins

Não respondo a duvidas por PM

Link to comment
Share on other sites

Talvez seja melhor utilizar uma fila(Queue), ou seja, tens lá os teus cinco threads a correr em simultâneo que vão encadear informações nessa fila, depois tens um outro thread que vai processar essa informação a medida que vai entrando.

O código que utilizo para chamar a thread é "thread.start()", que código utilizo para chamar uma thread em modo Queu? é o mesmo ou é preciso outro código para chamar a thread?

E como faço para enviar as variáveis para a thread Queu?

Link to comment
Share on other sites

Não vais chamar nenhum thread em modo Queue, vais é ter a informação numa Queue, tipo

    Dim Fila As New Queue(Of String)

    'Os cinco threads utilizam este sub para procurar informação
    Private Sub ProcuraNoMercado(ByVal MercadoAProcurar As String)
        'Faz o que tem a fazer
        '...
        '...

        Fila.Enqueue("SourceCode")

    End Sub

    'Um sexto thread vai processar a informação
    Private Sub ProcessaInformacao()
        While True 'Aqui deves substituir o True por algo que te diga que pelomenos um thread esta a correr
            Threading.Thread.Sleep(100)
            If Fila.Count > 0 Then
                Dim SourceCode As String
                SourceCode = Fila.Dequeue()

                '...
                '...
                'Processa o SourceCode
                '...
                '...

            End If
        End While
    End Sub

Pedro Martins

Não respondo a duvidas por PM

Link to comment
Share on other sites

Preciso de perceber um pouco melhor como o codigo funciona.

Vou tentar por aqui um pseudocódigo para que possas perceber melhor o k tenho e talvez me possas explicar melhor como funciona o teu.

Public class frmMain

dim thread1 as system thread

dim thread2 as system thread

dim thread3 as system thread

dim thread4 as system thread

dim thread5 as system thread

btnStart Chama as 5 private em cada thread declarada

private sub CodeExtractionthread1

private sub CodeExtractionthread2

private sub CodeExtractionthread3

private sub CodeExtractionthread4

private sub CodeExtractionthread5

public charRemover (Remove caracteres que não podem ser analisados por codigo)

Cada thread chama estas tres "privates" para extrair os dados em três fases.

private sub IncomeStatment

Private sub balancesheet

private sub cashFlow

Por cada um destes a aplicação chama a lstBox e inser nela os dados extraidos.

Se quiseres o código eu mando e pronto

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.