void CComponentVida::Update(float _fDeltaTime) { if(m_fHoTTime > 0.0f) { m_fHoTTime -= _fDeltaTime; Increase(m_fHoT * _fDeltaTime); }else { m_fHoTTime = 0.0f; } if(m_fDoTTime > 0.0f) { m_fDoTTime -= _fDeltaTime; Decrease(m_fDoT * _fDeltaTime); }else { m_fDoTTime = 0.0f; } if(m_bRegen) { if(m_fTimeSinceHit <= m_fTimeForRegen) { m_fTimeSinceHit += _fDeltaTime; }else{ Increase(m_fRegenAmount * _fDeltaTime); } } }
// 用例3: void CExampleTest::TestCase03() { const char * pMinuend = "8.5"; const char * pSubtrahend = "7.5"; char * pResult = NULL; Decrease(pMinuend, pSubtrahend, &pResult); CPPUNIT_ASSERT(pResult != NULL); CPPUNIT_ASSERT(strcmp(pResult, "1") == 0); free(pResult); }
// 用例4: void CExampleTest::TestCase04() { const char * pMinuend = "12.34"; const char * pSubtrahend = "17.24"; char * pResult = NULL; Decrease(pMinuend, pSubtrahend, &pResult); CPPUNIT_ASSERT(pResult != NULL); CPPUNIT_ASSERT(strcmp(pResult, "-4.9") == 0); free(pResult); }
void partitionDecreasing(int value) { printf("partitionDecreasing %d\n", value); int * arr = malloc(value * sizeof(int)); int ind = 0; Decrease(value,arr,ind); free(arr); }
int CSem::Dec(int nSemIdx, bool bNoWait, bool bUndo, int val) { if(m_nBCounterNum > 0) { return CounterDec(nSemIdx); } else { return Decrease(nSemIdx, bNoWait, bUndo, val); } }
void Decrease(int n,int * arr,int ind) { int val; if(n == 0) { partprint(arr,ind); return; } for(val=1;val<=n;val++) { arr[ind]=val; if (ind > 0 &&arr[ind-1]>arr[ind]) { Decrease(n-val,arr,ind+1); } if(ind ==0) { Decrease(n-val,arr,ind+1); } } }
int CSem::CreateCounter(int nKey, int nCounterNum) { if ( nCounterNum > MAX_BIGCOUNTER_NUM || nCounterNum < 1 ) { snprintf(m_errmsg, sizeof(m_errmsg), "%s=%d", __func__, SEM_ERR_CREATECOUNTER_PARA); return SEM_ERR_CREATECOUNTER_PARA; } int nCnt = nCounterNum * 2 + 1; int nSemID = semget ( nKey,nCnt,IPC_CREAT|0666 ); if (nSemID == -1) { snprintf(m_errmsg, sizeof(m_errmsg), "%s=%d,%s", __func__, SEM_ERR_CREATECOUNTER_SEMGET, strerror(errno)); return SEM_ERR_CREATECOUNTER_SEMGET; } m_nKey = nKey; m_nSemID = nSemID; m_nSemCnt = nCnt; m_nBCounterNum = nCounterNum; m_nMaxVal = SEM_VALUE_MAX * SEM_VALUE_MAX; //初始化信号量 union semun sem; sem.val = 0; sem.array = new ushort [nCnt]; for ( int i = 0; i < nCnt; i++ ) { sem.array[i] = 0; } sem.array[m_nSemCnt - 1] = m_nBCounterNum; //最后一个用于记录BigCounter个数 int nRet = semctl (m_nSemID, nCnt, SETALL, sem); delete [] sem.array; if ( nRet < 0 ) { snprintf(m_errmsg, sizeof(m_errmsg), "%s=%d,%s", __func__, SEM_ERR_CREATECOUNTER_SEMCTL, strerror(errno)); return SEM_ERR_CREATECOUNTER_SEMCTL; } nRet = Increase(0, true, true); if(nRet < 0) return nRet; nRet = Decrease(0, true, true); if(nRet < 0) return nRet; return m_nSemID; }
void CComponentVida::ReceiveEvent(const SEvent& _Event) { if(_Event.Msg == SEvent::REBRE_IMPACTE) { assert(_Event.Info[0].Type == SEventInfo::FLOAT); if(m_fVida > 0.f) { float l_fDamage = _Event.Info[0].f; //Si té escut, el mal el rep aquest. //La resta del mal passa al jugador per si l'escut es trenca. if(m_pShield) l_fDamage = m_pShield->Decrease(l_fDamage); Decrease(l_fDamage); } else return; }else /*if(_Event.Msg == SEvent::REBRE_FORCE) { if(m_fVida > 0.f) { float l_fDamage = _Event.Info[0].f; Decrease(l_fDamage); if(m_fVida <= 0.f) { SEvent l_morir; l_morir.Msg = SEvent::MORIR; l_morir.Receiver = l_morir.Sender = GetEntity()->GetGUID(); CORE->GetEntityManager()->SendEvent(l_morir); } } }else*/ if(_Event.Msg == SEvent::MORIR) { m_fVida = 0.0f; m_bRegen = false; } }
void TimeTextCtrl::OnMouse(wxMouseEvent &event) { if (event.LeftDown() && event.GetX() >= mWidth) { wxContextMenuEvent e; OnContext(e); } else if (event.LeftDown()) { SetFocus(); int bestDist = 9999; unsigned int i; mFocusedDigit = 0; for(i=0; i<mDigits.GetCount(); i++) { int dist = abs(event.m_x - (mDigits[i].digitBox.x + mDigits[i].digitBox.width/2)); if (dist < bestDist) { mFocusedDigit = i; bestDist = dist; } } Refresh(false); } else if (event.RightDown() && mMenuEnabled) { wxContextMenuEvent e; OnContext(e); } else if( event.m_wheelRotation != 0 ) { int steps = event.m_wheelRotation / (event.m_wheelDelta > 0 ? event.m_wheelDelta : 120); if (steps < 0) { Decrease(-steps); Updated(); } else { Increase(steps); Updated(); } } }
/** Called by ServiceL() It tests the function code and then delegates to the appropriate function. */ void CCountServSession::DispatchMessageL(const RMessage2& aMessage) { switch (aMessage.Function()) { case ECountServSetFromString: SetFromStringL(aMessage); return; case ECountServIncrease: Increase(); return; case ECountServIncreaseBy: IncreaseBy(aMessage); return; case ECountServDecrease: Decrease(); return; case ECountServDecreaseBy: DecreaseBy(aMessage); return; case ECountServReset: Reset(); return; case ECountServValue: CounterValueL(aMessage); return; // This is an example of a request that we know about, but don't support. // We cause KErrNotSupported to be returned to the client. case ECountServUnsupportedRequest: User::Leave(KErrNotSupported); // Requests that we don't understand at all are a different matter. // This is considered a client programming error, so we panic the // client - this also completes the message. default: PanicClient(aMessage,EBadRequest); return; } }
void LWSlider::OnMouseEvent(wxMouseEvent & event) { if (event.Entering()) { #if wxUSE_TOOLTIPS // Not available in wxX11 // Display the tooltip in the status bar if (mParent->GetToolTip()) { wxString tip = mParent->GetToolTip()->GetTip(); GetActiveProject()->TP_DisplayStatusMessage(tip); Refresh(); } #endif } else if (event.Leaving()) { GetActiveProject()->TP_DisplayStatusMessage(wxT("")); Refresh(); } // Events other than mouse-overs are ignored when we are disabled if (!mEnabled) return; float prevValue = mCurrentValue; // Figure out the thumb position wxRect r; if (mOrientation == wxHORIZONTAL) { r.x = mLeft + ValueToPosition(mCurrentValue); r.y = mTop + (mCenterY - (mThumbHeight / 2)); } else { r.x = mLeft + (mCenterX - (mThumbWidth / 2)); r.y = mTop + ValueToPosition(mCurrentValue); } r.width = mThumbWidth; r.height = mThumbHeight; wxRect tolerantThumbRect = r; tolerantThumbRect.Inflate(3, 3); // Should probably use a right click instead/also if( event.ButtonDClick() && mPopup ) { //On a double-click, we should pop up a dialog. DoShowDialog(mParent->ClientToScreen(wxPoint(event.m_x,event.m_y))); } else if( event.ButtonDown() ) { if( mDefaultShortcut && event.CmdDown() ) { mCurrentValue = mDefaultValue; } if( event.RightDown() ) { mParent->SetFocus(); } // Thumb clicked? // // Do not change position until first drag. This helps // with unintended value changes. if( tolerantThumbRect.Contains( event.GetPosition() ) ) { // Remember mouse position and current value mClickPos = (mOrientation == wxHORIZONTAL) ? event.m_x : event.m_y; mClickValue = mCurrentValue; mIsDragging = true; } // Clicked to set location? else { mCurrentValue = ClickPositionToValue( (mOrientation == wxHORIZONTAL) ? event.m_x : event.m_y, event.ShiftDown()); } mParent->CaptureMouse(); // wxSetCursor(wxCURSOR_BLANK); ((TipPanel*)LWSlider::sharedTipPanel)->SetTargetParent(mParent); FormatPopWin(); SetPopWinPosition(); LWSlider::sharedTipPanel->Show(); //hide mouseover tooltip wxToolTip::Enable(false); } else if( event.ButtonUp() ) { mIsDragging = false; if (mParent->HasCapture()) mParent->ReleaseMouse(); LWSlider::sharedTipPanel->Hide(); //restore normal tooltip behavor for mouseovers wxToolTip::Enable(true); // wxSetCursor(wxNullCursor); } else if (event.Dragging() && mIsDragging) { if (mOrientation == wxHORIZONTAL) { if (event.m_y < (r.y - 2 * r.height) || event.m_y > (r.y + 3 * r.height)) { // If the mouse y coordinate is relatively far from the slider, // snap back to the original position mCurrentValue = mClickValue; } else { // Otherwise, move the slider to the right position based // on the mouse position mCurrentValue = DragPositionToValue(event.m_x, event.ShiftDown()); } } else // (mOrientation == wxVERTICAL) { if (event.m_x < (r.x - 2 * r.width) || event.m_x > (r.x + 3 * r.width)) { // If the mouse x coordinate is relatively far from the slider, // snap back to the original position mCurrentValue = mClickValue; } else { // Otherwise, move the slider to the right position based // on the mouse position mCurrentValue = DragPositionToValue(event.m_y, event.ShiftDown()); } } } else if( event.m_wheelRotation != 0 ) { //Calculate the number of steps in a given direction this event //represents (allows for two or more clicks on a single event.) double steps = event.m_wheelRotation / (event.m_wheelDelta > 0 ? (double)event.m_wheelDelta : 120.0); if( steps < 0.0 ) { Decrease( (float)-steps ); } else { Increase( (float)steps ); } SendUpdate( mCurrentValue ); } if( prevValue != mCurrentValue ) SendUpdate( mCurrentValue ); }
void LWSlider::OnKeyEvent(wxKeyEvent & event) { if (mEnabled) { switch( event.GetKeyCode() ) { case WXK_RIGHT: case WXK_UP: Increase( mScrollLine ); SendUpdate( mCurrentValue ); break; case WXK_LEFT: case WXK_DOWN: Decrease( mScrollLine ); SendUpdate( mCurrentValue ); break; case WXK_PAGEUP: #if !wxCHECK_VERSION(2,7,0) case WXK_PRIOR: #endif Increase( mScrollPage ); SendUpdate( mCurrentValue ); break; case WXK_PAGEDOWN: #if !wxCHECK_VERSION(2,7,0) case WXK_NEXT: #endif Decrease( mScrollPage ); SendUpdate( mCurrentValue ); break; case WXK_HOME: SendUpdate( mMinValue ); break; case WXK_END: SendUpdate( mMaxValue ); break; case WXK_TAB: { wxNavigationKeyEvent nevent; nevent.SetWindowChange( event.ControlDown() ); nevent.SetDirection( !event.ShiftDown() ); nevent.SetEventObject( mParent ); nevent.SetCurrentFocus( mParent ); mParent->GetParent()->ProcessEvent( nevent ); } break; case WXK_RETURN: case WXK_NUMPAD_ENTER: { wxTopLevelWindow *tlw = wxDynamicCast(wxGetTopLevelParent(mParent), wxTopLevelWindow); wxWindow *def = tlw->GetDefaultItem(); if (def && def->IsEnabled()) { wxCommandEvent cevent(wxEVT_COMMAND_BUTTON_CLICKED, def->GetId()); mParent->ProcessEvent(cevent); } } default: // Allow it to propagate event.Skip(); break; } } event.Skip(); }
// [ Sem1 Sem2 ] = SmallCounter // 两个信号量为1个SmallCounter,组成1个小计数器,第一个信号量用作开关,第二个用于计数 // // [Group1]...[GroupN] = BigCounter // 多个SmallCounter组成1个大计数器 // // [BigCounter1] ... [BigCounterN] = Semaphores // 信号量集根据大计数器的个数,为每个大计数器平均分配SmallCounter数量 // // 每个BigCounter的最大计数值 = SmallCounter数量 * SEM_VALUE_MAX int CSem::CreateCounter(int nKey, int nCounterNum) { if ( nCounterNum > MAX_BIGCOUNTER_NUM || nCounterNum < 1 ) { snprintf(m_errmsg, sizeof(m_errmsg), "%s=%d", __func__, SEM_ERR_CREATECOUNTER_PARA); return SEM_ERR_CREATECOUNTER_PARA; } int nCnt = 65535; int nSemID = semget ( nKey,nCnt,IPC_CREAT|0666 ); if (nSemID == -1) { snprintf(m_errmsg, sizeof(m_errmsg), "%s=%d,%s", __func__, SEM_ERR_CREATECOUNTER_SEMGET, strerror(errno)); return SEM_ERR_CREATECOUNTER_SEMGET; } m_nKey = nKey; m_nSemID = nSemID; m_nSemCnt = nCnt; m_nBCounterNum = nCounterNum; int res = 0; if(m_nBCounterNum % 2 == 0) { res = 0;//剩下的是单数 } else res = 1;//剩下的是双数 m_nSCounterNum = ((m_nSemCnt - res - m_nBCounterNum - 1) / m_nBCounterNum) / 2 ; m_nMaxVal = m_nSCounterNum * SEM_VALUE_MAX; //初始化信号量 union semun sem; sem.val = 0; sem.array = new ushort [nCnt]; for ( int i = 0; i < m_nSCounterNum * 2 * m_nBCounterNum; i++ ) { if(i % (m_nSCounterNum * 2) == 0) //第一个开关打开 { sem.array[i] = 0; continue; } if(i % 2 == 0) //其余开关关闭 { sem.array[i] = 1; } else //计数器清0 sem.array[i] = 0; } for ( int i = m_nSCounterNum * 2 * m_nBCounterNum; i < m_nSCounterNum * 2 * m_nBCounterNum + m_nBCounterNum; i++ )//SmallCounter记录清0 { sem.array[i] = 0; } for ( int i = m_nSCounterNum * 2 * m_nBCounterNum + m_nBCounterNum; i < m_nSemCnt - 1; i++ )//用于锁 { sem.array[i] = 0; } sem.array[m_nSemCnt - 1] = m_nBCounterNum; //最后一个用于记录BigCounter个数 int nRet = semctl (m_nSemID, nCnt, SETALL, sem); delete [] sem.array; if ( nRet < 0 ) { snprintf(m_errmsg, sizeof(m_errmsg), "%s=%d,%s", __func__, SEM_ERR_CREATECOUNTER_SEMCTL, strerror(errno)); return SEM_ERR_CREATECOUNTER_SEMCTL; } nRet = Increase(0, true, true); if(nRet < 0) return nRet; nRet = Decrease(0, true, true); if(nRet < 0) return nRet; return m_nSemID; }
int CSem::Create(int nKey, int nCnt, int initVal) { assert ( nKey != -1 ); int nSemID, nRet; union semun sem ; if ( nCnt < 1 ) { snprintf(m_errmsg, sizeof(m_errmsg), "%s=%d", __func__, SEM_ERR_CREATE_PARA); return SEM_ERR_CREATE_PARA; } nSemID = semget ( nKey,nCnt,IPC_CREAT|0666 ); if (nSemID == -1) { snprintf(m_errmsg, sizeof(m_errmsg), "%s=%d,%s", __func__, SEM_ERR_CREATE_SEMGET, strerror(errno)); return SEM_ERR_CREATE_SEMGET; } m_nKey = nKey; m_nSemID = nSemID; m_nSemCnt = nCnt; //初始化信号量 sem.val = initVal; sem.array = new ushort [nCnt]; for ( int i = 0; i < nCnt; i++ ) sem.array[i] = initVal; nRet = semctl (m_nSemID, nCnt, SETALL, sem); delete [] sem.array; if ( nRet < 0 ) { snprintf(m_errmsg, sizeof(m_errmsg), "%s=%d,%s", __func__, SEM_ERR_CREATE_SEMCTL, strerror(errno)); return SEM_ERR_CREATE_SEMCTL; } ///初始化后立即调用,主要是要调用semop函数操作改变arg.buf->sem_otime if(initVal == SEM_VALUE_MAX) { nRet = Decrease(0, true, true); if(nRet < 0) return nRet; nRet = Increase(0, true, true); if(nRet < 0) return nRet; } else { nRet = Increase(0, true, true); if(nRet < 0) return nRet; nRet = Decrease(0, true, true); if(nRet < 0) return nRet; } return m_nSemID; }
void TimeTextCtrl::OnKeyDown(wxKeyEvent &event) { event.Skip(false); int keyCode = event.GetKeyCode(); int digit = mFocusedDigit; if (mFocusedDigit < 0) mFocusedDigit = 0; if (mFocusedDigit >= (int)mDigits.GetCount()) mFocusedDigit = mDigits.GetCount()-1; // Convert numeric keypad entries. if ((keyCode >= WXK_NUMPAD0) && (keyCode <= WXK_NUMPAD9)) keyCode -= WXK_NUMPAD0 - '0'; if (keyCode >= '0' && keyCode <= '9') { mValueString[mDigits[mFocusedDigit].pos] = wxChar(keyCode); ControlsToValue(); ValueToControls(); mFocusedDigit = (mFocusedDigit+1)%(mDigits.GetCount()); Updated(); } else if (keyCode == WXK_BACK) { // Moves left, replaces that char with '0', stays there... mFocusedDigit--; mFocusedDigit += mDigits.GetCount(); mFocusedDigit %= mDigits.GetCount(); mValueString[mDigits[mFocusedDigit].pos] = '0'; ControlsToValue(); ValueToControls(); Updated(); } else if (keyCode == WXK_LEFT) { mFocusedDigit--; mFocusedDigit += mDigits.GetCount(); mFocusedDigit %= mDigits.GetCount(); Refresh(); } else if (keyCode == WXK_RIGHT) { mFocusedDigit++; mFocusedDigit %= mDigits.GetCount(); Refresh(); } else if (keyCode == WXK_HOME) { mFocusedDigit = 0; Refresh(); } else if (keyCode == WXK_END) { mFocusedDigit = mDigits.GetCount() - 1; Refresh(); } else if (keyCode == WXK_UP) { Increase(1); Updated(); } else if (keyCode == WXK_DOWN) { Decrease(1); Updated(); } else if (keyCode == WXK_TAB) { wxWindow *parent = GetParent(); wxNavigationKeyEvent nevent; nevent.SetWindowChange(event.ControlDown()); nevent.SetDirection(!event.ShiftDown()); nevent.SetEventObject(parent); nevent.SetCurrentFocus(parent); GetParent()->ProcessEvent(nevent); } else if (keyCode == WXK_RETURN || keyCode == WXK_NUMPAD_ENTER) { wxTopLevelWindow *tlw = wxDynamicCast(wxGetTopLevelParent(this), wxTopLevelWindow); wxWindow *def = tlw->GetDefaultItem(); if (def && def->IsEnabled()) { wxCommandEvent cevent(wxEVT_COMMAND_BUTTON_CLICKED, def->GetId()); GetParent()->ProcessEvent(cevent); } } else { event.Skip(); return; } if (digit != mFocusedDigit) { SetFieldFocus(mFocusedDigit); } event.Skip(false); }